组件库的响应式扩展.由桌面应用程序和其他环境消耗

本文关键字:应用程序 其他 环境 桌面 响应 扩展 组件 | 更新日期: 2023-09-27 18:19:16

我已经构建了一个组件库,其中包括一个执行类,它可以在任意数量的线程上工作,并从这些线程中触发事件。这一切都很好。现在我想在桌面应用程序中使用我的执行程序(第一个实例是Winforms,稍后是WPF),所以我想将所有事件调用回调到UI线程中。我知道有3种方法;

  • 在处理程序中检查isinvokedrerequired/call Invoke;在我看来,这太差劲了。
  • 为执行器创建一个使用事件基异步模型的装饰器;给了我想要的结果,虽然不是很令人兴奋。
  • 使用WPF调度程序;感觉在Winforms应用程序中使用WPF类是错误的,在组件库中使用它更是错误的。

我花了一个小时左右的时间来阅读Rx,我认为理想的解决方案可能是将Rx放入执行器中,并让执行器(可选)使用调度程序。通过这种方式,执行器的客户端可以确定有关事件在哪个线程上引发的行为,并且我获得了所有其他Rx优点。或者创建一个RxExecutive,它接受一个Scheduler,并封装我现有的executive来提供一个Rx API。

我的思路是正确的还是我错过了重点?

组件库的响应式扩展.由桌面应用程序和其他环境消耗

Rx确实提供了一种非常好的方式来访问Windows窗体应用程序中的UI线程。你可以使用完整的Rx可观察对象库,但如果你只是需要一种简单的方法来运行UI线程上的东西,那么使用ControlScheduler是一个快速。

假设您有一个名为form1的表单,只需这样做:

var scheduler = new System.Reactive.Concurrency.ControlScheduler(form1);
scheduler.Schedule(() => { /* Do Stuff on UI thread */ });

容易。

你不必使用对表单的引用——你可以使用任何控件

我认为首选的模式是指定调度SynchronizationContext。SynchronizationContexts可用于WPF和WinForms应用程序,用于调度WF4和WCF,我相信也用于框架的其他部分。

你做对了。或者,您可以让关心线程的用户使用ObserveOn。这样做的好处是只有观察者代码在需要的线程上运行。