组件库的响应式扩展.由桌面应用程序和其他环境消耗
本文关键字:应用程序 其他 环境 桌面 响应 扩展 组件 | 更新日期: 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
。这样做的好处是只有观察者代码在需要的线程上运行。