[英]RX and Model-View-Presenter in WinForms
我是RX的新手,我正在尝试使其适应我的WinForms应用程序。 (Un?)幸运的是,我使用MVP模式,其中View是从任何特定实现(例如WinForms)中抽象出来的。
当RX友好模型产生新值时,演示者获取它并尝试更新视图。 问题是,由于我没有引用WinForms控件,因此无法在主线程上进行观察。
我找到了一些解决方案,但对我来说都不满意:
:
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
}
演示者在订阅模型时是否在UI线程上运行? 您现在订阅可观察对象时,只需使用ObserveOnDispatcher :
// from your presenter code, which is running on the UI thread:
model.ObservableProperty.ObserveOnDispatcher().Subscribe(p => updateView(p));
编辑:
或者,您可以获取Rx-Windows Forms Helper
并让您的IMyView
界面公开一个IScheduler
(它通过调用new ControlScheduler(control)
创建)。
然后,您可以将ObserveOn(observable, view)
扩展方法实现为:
public static IObservable<T> ObserveOn<T>(this IObservable<T> observable, IMyView view)
{
return observable.ObserveOn(view.Scheduler);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.