1

Foobarスレッド X で構築されたクラスのインスタンスがあります。StartWork()スレッド X からのみ呼び出す必要がある関数があります。バグの作成を避けるために、チェックしてこの制約を適用しますDebug.Assert(CreatorID == Environment.CurrentManagedThreadId)。この関数は、 の非同期操作を開始しますBackgroundWorkerWorkCompleted()ワーカーが にフックして操作を終了すると、が確実に呼び出されるようにしましたRunWorkerCompleted

スレッド セーフの理由からWorkCompleted()、スレッド X で実行する必要があります。これは、イベント通知を送信するためです。これらの通知が間違ったスレッドからブロードキャストされた場合、プログラムで予期しないスレッド セーフの問題が発生する可能性があると思います。

ただし、私のテストでは、WorkCompleted()期待どおりにスレッド X から呼び出されないことに気付きました。これらのイベントが発生することによって発生する可能性のあるスレッド セーフの問題を防ぐためにプログラムを修正するにはどうすればよいですか? 私は問題に間違ってアプローチしていますか? BackgroundWorker.DoWorkハンドラーをスレッドセーフにする必要があることはすでに認識しています。

4

1 に答える 1

0

UI スレッドでRunWorkerCompletedのインスタンスを作成することで、ハンドラーを同じスレッドで実行することができました。この回答Foobarからの関連スニペット:

BackgroundWorkerが UI スレッドから作成された場合、RunWorkerCompletedイベントは UI スレッドでも発生します。

于 2012-10-21T13:20:35.897 に答える