0

BackgroundWorker を使用してアプリケーションのデータ構造を変更する場合、BackgroundWorker が完了すると (たとえば、RunWorkerCompleted イベント ハンドラー内で)、バックグラウンド スレッドで行われた変更がメイン (UI) スレッドに表示されるという保証はありますか? ボーナス ポイントについて: もしそうなら、これを保証するメカニズムは何ですか?

4

2 に答える 2

3

いいえ、そのような保証はありません。複数のスレッドから共有メモリにアクセスする場合は、共有メモリへのアクセスを自分で同期する必要があります。

もちろん、BGW に組み込まれているメカニズムを使用してスレッド間でデータを渡す場合Result(またはProgress格納されているデータなど)、そのデータへのアクセスを適切に同期します。

于 2014-11-14T18:03:27.550 に答える
2

はい、BackgroundWorker 契約に従っている限り、これは心配する必要はありません。つまり、提供されたイベントを使用して、データを UI スレッド、ProgressChanged、および RunWorkerCompleted に送ります。.NET Framework のソース コードは、これについて洗練されたポイントを獲得していません。同期は明示的ではありません。これはかなり一般的で、多くの場所で暗黙の同期に依存しています。

ただし、UI スレッドが更新を確認できるようにするものは 2 つあります。1 つ目は PostMessage() です。これは、呼び出しキューを確認する必要があることを UI スレッドに通知するために使用される winapi 関数です。 ここで使用しますが、ロックはまったく見えず、Windows の内部に埋もれています。より簡単に認識できるのは、呼び出しキューを空にする Winforms コード内にあります。そのキューの反復を開始する前に、ロックを取得します。ここで確認できます。これは、 threadCallbackListメンバーのロックです。

于 2014-11-14T18:35:40.927 に答える