【问题标题】:Execute method on another thread with ToObservable使用 ToObservable 在另一个线程上执行方法
【发布时间】:2016-09-26 11:27:28
【问题描述】:

我在 WPF 应用程序的非 UI 线程上运行方法(基于 ToObservable)时遇到问题。

例如我有这个方法:

    public IObservable<ViewModel> Get()
    {
        IEnumerable<ViewModel> vms = _repository.Get();

        Thread.Sleep(2000);

        return vms.ToObservable();
    }

我在 ViewModel 中使用这个方法:

  manager.Get()
         .ObserveOnDispatcher()
         .SubscribeOn(new NewThreadScheduler())
         .Subscribe(result =>
                    {
                        Data.Add(result);
                    });

问题是 Get 方法在 UI/Main 线程上执行,但我需要在非 UI 线程上运行此方法。

【问题讨论】:

标签: c# multithreading system.reactive observable


【解决方案1】:

我建议在Observable.Start 内部调用manager.Get(),然后只需执行.Merge() 即可将IObservable&lt;IObservable&lt;ViewModel&gt;&gt; 带回IObservable&lt;ViewModel&gt;

试试这个:

Observable
    .Start(() => manager.Get(), Scheduler.Default)
    .Merge()
    .ObserveOnDispatcher()
    .SubscribeOn(new NewThreadScheduler())
    .Subscribe(result =>
    {
        Data.Add(result);
    });

.SubscribeOn(new NewThreadScheduler()) 可能不是必需的。

【讨论】:

  • 同意。为了 Rx,OP 似乎让他们的 API 看起来像 Rx。但是代码未能正确采用 Rx,例如可能应该使用Observable.CreateObservable.Start 并接受IScheduler 参数。但是,将 API 保持为 IEnumerable&lt;T&gt; 并仅在需要时才移至 Rx 是合理的。
【解决方案2】:

你的想法是对的。但是,为了有效地使用ObserveOnSubscribeOn 运算符,您需要有一个可观察的源。在您的示例中,您似乎没有。一旦你得到它,你可以这样做:

IObservable<TAnything> source;

source
    .ObserveOn(Scheduler.ThreadPool)
    .SelectMany(_ => Get())
    .ObserveOn(DispatcherScheduler.Instance)
    .Subscribe(result =>
    {
        Data.Add(result);
    });

在您的情况下,source 很可能是通过单击按钮或其他事件生成的 observable。

ObserveOn 为给定的调度程序调度它后面的代码。因此,在我们的例子中,第一个 ObserveOn 调用使后面的代码发生在 ThreadPool(非 UI)上。第二个ObserveOn 使代码发生在调度程序(UI)上。

SubscribeOn 使订阅时间代码发生在给定的调度程序上。由于您的代码示例在订阅时没有发生任何有趣的事情,因此删除它是有意义的。

【讨论】:

  • 总的来说我同意,但我特别会引导人们不要在这种性质中混用ObserveOn 电话。假设您的 Rx 编写正确,那么遵循.SubcribeOn(Scheduler.ThreadPool).ObserveOn(DispatcherScheduler.Instance).Subscribe(result=&gt;Data.Add(result)); 模式的指导请参阅introtorx.com/Content/v1.0.10621.0/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多