ReactiveUI:无法获取在后台线程上运行的代码

时间:2014-08-04 17:09:36

标签: wpf reactiveui

只是涉及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; }
}

1 个答案:

答案 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();

为什么要在这里创建两个单独的命令?