-1

タスクを実行するために backgroundworker を呼び出し、ProgressChanged Event を介してコントロールを変更していますが、別の backgroundworker から backgroundworker を呼び出すまでは正常に機能していました。今、このクロススレッド操作の例外が発生しています。

4

2 に答える 2

2

のドキュメントによるとBackgroundWorker.ReportProgress

ReportProgress メソッドの呼び出しは非同期であり、すぐに戻ります。ProgressChanged イベント ハンドラーは、BackgroundWorker を作成したスレッドで実行されます。

したがって、ProgressChanged イベント ハンドラーでコントロールを直接更新する場合は、UI スレッドで BackgroundWorkers を作成する必要があります。

于 2013-06-01T15:22:30.607 に答える
2

RunWorkerAsync を呼び出すと、BackgroundWorker はその時点の同期コンテキストをキャプチャし、その後 ProgressChanged イベントが発生したときにその同期コンテキストが使用されます。UI スレッド以外のスレッドで RunWorkerAsync を呼び出した場合 (これは、別のワーカーの DoWork ハンドラー内で呼び出した場合に発生します)、ProgressChanged イベントが非 UI スレッドで発生します。この状況でイベント ハンドラーが UI にアクセスしようとすると、説明した例外が発生します。

RunWorkerAsync への 2 番目の呼び出しを最初のワーカーの ProgressChanged/RunWorkerCompleted イベントのハンドラーに移動するか、一時的に UI スレッドに切り替える別の方法 (Control.Invoke または同様のメソッドを使用) を見つける必要があります。

于 2013-06-01T15:22:50.953 に答える