只是涉足 RxUI 并尝试让一个简单的例子工作......
我有一个带有列表框和按钮的 WPF 视图。
当我按下按钮 (Go) 时,我想在后台线程上运行一个方法,并将其生成的结果添加到列表框中。
我正在记录线程 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; }
}
在您提出请求之前,Rx 不会切换线程,而 GetAsyncResults 只是同步返回项目列表。您需要指定RxApp.TaskpoolScheduler
将内容移至后台线程。
public static IObservable<string> GetAsyncResults()
{
return (new[] {"Rod", "Jane", "Freddy"}).ToObservable(RxApp.TaskpoolScheduler);
}
seq.ObserveOn(Scheduler.CurrentThread);
你没有使用它的返回值,所以它没有做任何事情
Go = ReactiveCommand.Create();
为什么要在这里创建两个单独的命令?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)