我是 RX 新手,我正在尝试使其适应我的 WinForms 应用程序。(不?)幸运的是,我使用 MVP 模式,其中视图是从任何特定实现(例如 WinForms)中抽象出来的。
当 RX-friendly Model 产生新值时,presenter 得到它并尝试更新视图。问题是我无法在主线程上观察,因为我没有参考 WinForms Control。
我找到了一些解决方案,但它们都不适合我:
- 在视图中创建一个 Control 属性,以便我可以观察它。
- 在由 Presenter 修改的属性设置器中使用 Control.Invoke
- 创建类似于以下的扩展方法:
:
public static IObservable<T> ObserveOn<T>(this IObservable<T> observable, IMyView view)
{
var control = (Control)view;
return observable.ObserveOn(control);
}
有没有很好的方法来处理这个?
编辑:我找到了另一个我最喜欢的解决方案:
private readonly SynchronizationContext _syncContext;
public Presenter()
{
_syncContext = SynchronizationContext.Current; //I can observe on this one with a reasonable assumption that presenter is created on the UI thread
}