只是涉及RxUI并试图找到一个可以工作的例子......
我有一个带有ListBox和按钮的WPF视图。 当我按下按钮(Go)时,我想在后台线程上运行一个方法,并将它产生的结果添加到ListBox中。 我正在记录线程ID以检查执行的位置。 问题是我总是看到在同一个线程上发生的所有操作。 我已尝试在CreateAsyncObservable上指定Scheduler.Default,但之后没有任何内容添加到ListBox。
public class MainViewModel : ReactiveObject
{
public MainViewModel()
{
Results = new ReactiveList<string>();
var seq = ReactiveCommand.CreateAsyncObservable(_ => GetAsyncResults());
seq.ObserveOn(Scheduler.CurrentThread);
seq.Subscribe(s =>
{
Results.Add(string.Format("{0} thread {1}", s, Thread.CurrentThread.ManagedThreadId));
});
Results.Add(string.Format("main thread {0}", Thread.CurrentThread.ManagedThreadId));
Go = ReactiveCommand.Create();
Go.Subscribe(_ => seq.Execute(null));
}
public static IObservable<string> GetAsyncResults()
{
Thread.Sleep(1000);
return (new[] {"Rod", "Jane", "Freddy"}).ToObservable();
}
private readonly ObservableAsPropertyHelper<List<string>> _strings;
public List<string> Strings {get { return _strings.Value; }}
public ReactiveCommand<object> Go { get; protected set; }
public ReactiveList<string> Results { get; set; }
}
答案 0 :(得分:1)
Rx在您询问之前不会切换线程,并且GetAsyncResults只是同步返回项目列表。您需要指定RxApp.TaskpoolScheduler
将内容移动到后台线程。
public static IObservable<string> GetAsyncResults()
{
return (new[] {"Rod", "Jane", "Freddy"}).ToObservable(RxApp.TaskpoolScheduler);
}
seq.ObserveOn(Scheduler.CurrentThread);
您没有使用此返回值,因此它不会执行任何操作
Go = ReactiveCommand.Create();
为什么要在这里创建两个单独的命令?