【问题标题】:how to force ObserveOn() on calling thread?如何在调用线程上强制 ObserveOn()?
【发布时间】:2016-06-13 12:55:39
【问题描述】:

我有一个响应式 UI/rx 应用程序。目前,我正在开发它的桌面部分,所以它是一个 wpf 应用程序。由于性能原因,我想在其单独的线程中创建每个窗口。

这就是为什么我需要在当前线程上运行 ObserveOn

someCollection.Changed.Buffer(TimeSpan.FromSeconds(n)).ObserveOn(*should be a link to a current thread*).Subscribe(bufferedItems => {})

此外,此代码位于可移植库中,这就是为什么我不能使用 System.Threading.Thread 类

有什么解决办法吗?

【问题讨论】:

  • 什么是“当前线程”?它是 UI 线程还是任何随机线程?如果它是 UI/主线程,您可以使用 SynchronizationContext.Current 作为您的 ObserveOn 的参数,但如果它是任何随机线程,您可能必须编写自己的调度程序(或者至少我不知道这样做的人之一)。
  • 我在一个新线程中创建了一个窗口,这样窗口对象就会有一个单独的调度程序(根据这个eprystupa.wordpress.com/2008/07/28/…)。 SynchronizationContext.Current 不起作用,因为如果不是从 ui 线程调用它,它将始终返回 null。我已经尝试过编写自己的调度程序,但工作是创建一个新线程,而不是重用现有线程

标签: c# wpf multithreading system.reactive reactiveui


【解决方案1】:

如果您可以捕获Dispatcher,则可以将其提供给DispatcherScheduler

var currentDispatcher = Dispatcher.CurrentDispatcher;
var scheduler = new DispatcherScheduler(currentDispatcher);

Observable.Empty<int>().ObserveOn(scheduler)....

【讨论】:

  • 是的!而已。非常感谢!
猜你喜欢
  • 2018-06-28
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多