私は現在、winformsデータバインディングとバックグラウンドスレッドからの更新(100を超えるレコードで1秒に1回)を頻繁に使用するアプリケーションのデータバインディング部分を設計/改訂しています。WinFormsマルチスレッドデータバインディングシナリオ、ベストプラクティス?
アプリケーションが株式取引アプリケーションであり、バックグラウンドスレッドがデータ変更を監視し、それらをデータオブジェクトに配置するとします。これらのオブジェクトはBindingList<>
に格納され、INotifyPropertyChanged
を実装して、変更をデータバインドを介してwinformsコントロールに伝播します。 さらに、データオブジェクトは現在、WinformsSynchronizationContext.Send
を介してUIスレッドに変更をマーシャリングしています。 ユーザーはUIの一部の値を入力することができます。つまり、値の一部を両側から変更することができます。ユーザーの値は更新によって上書きされるべきではありません。
だから私の心に来て、いくつか質問があります。
- は、一般的な設計・ギルドラインは、(データバインディングのバックグラウンド更新)ことを行う方法ありますか?
- UIスレッドでマーシャリングする方法とタイミングは?
- バインディング/データオブジェクトと対話するバックグラウンドスレッドの最良の方法は何ですか?
- どのクラス/インターフェイスを使用する必要がありますか? (のBindingSource、...)
- ...
UIは本当にコントロールの更新をバックグラウンドスレッドがあることを知りませんし、データバインディングのシナリオで私の理解のようUI「はshouldnデータがどこから来ているかを知っている...バックグラウンドスレッドはUIにデータをプッシュするものだと考えることができるので、バックグラウンド作業者が私が探しているオプションであるかどうかは分かりません。
場合によっては、データ/ビジネスオブジェクトの操作中にUI応答を取得したいことがあります(たとえば、再計算中に背景を設定するなど)。バックグラウンドにバインドされているステータスプロパティでプロパティを変更するだけでは、計算が完了した後にコントロールが再描画されるため、十分ではありません。私の考えは、プロパティ変更されたイベントをフックし、コントロールの.update()を呼び出すことです... それについての他のアイデア?
System.ComponentModel.BackgroundWorker、ソリューションの一部であってもよい、しかし、ハードの問題は、UIスレッドを見ずに高速なデータ更新を維持する方法です。スレッドの呼び出しをロックまたはクロスすることについて考えなくても、1行おきにすることなく、上記のことを行うことができます。 –
Backgroundworkerを見ると、スレッドの作成に大きな違いはなく、WindowsFormsSynchronizationContextでマーシャリングすると、BWは同じことを行います。 –
レスポンスの編集を参照してください。 – Dun3