RX は初めてで、WinForms アプリケーションに適応させようとしています。(Un?)幸いなことに、ビューが特定の実装 (WinForms など) から抽象化される MVP パターンを使用します。
RX フレンドリー モデルが新しい値を生成すると、プレゼンターはそれを取得し、ビューを更新しようとします。問題は、WinForms コントロールへの参照がないため、メイン スレッドで観察できないことです。
いくつかの解決策を見つけましたが、どちらもうまくいきません。
- ビューに Control プロパティを作成して、それを観察できるようにします。
- プレゼンターによって変更されるプロパティ セッター内で 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
}