2

我是 RX 新手,我正在尝试使其适应我的 WinForms 应用程序。(不?)幸运的是,我使用 MVP 模式,其中视图是从任何特定实现(例如 WinForms)中抽象出来的。

当 RX-friendly Model 产生新值时,presenter 得到它并尝试更新视图。问题是我无法在主线程上观察,因为我没有参考 WinForms Control。

我找到了一些解决方案,但它们都不适合我:

  1. 在视图中创建一个 Control 属性,以便我可以观察它。
  2. 在由 Presenter 修改的属性设置器中使用 Control.Invoke
  3. 创建类似于以下的扩展方法:

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
}
4

1 回答 1

1

演示者在订阅模型时是否在 UI 线程上运行?只需在您的礼物订阅 observable 时使用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);
}
于 2013-07-01T18:27:10.053 回答