4

ProgressChangedイベントハンドラーはイベントハンドラー内のどこかから発生するため、UIスレッドではなくDoWork、非同期操作スレッドでDoWork呼び出す必要があります。したがって、呼び出しやBeginInvokeコントロールの操作が必要になりますか?

私の推測では、メソッド内で何らかの魔法が起こっていると思いますが、イベントハンドラーReportProgressを呼び出すための正しいスレッドがどれであるかをどのようにして知ることができますか?ProgressChanged

4

1 に答える 1

6

を呼び出すとRunWorkerAsync、静的プロパティを通じて取得されたように、現在の同期コンテキストに関連付けられBackgroundWorkerた new が内部的に作成されます。AsyncOperationAsyncOperationManager.SynchronizationContext

この同期コンテキストは、 から派生したクラスのインスタンスになりますSynchronizationContext。特定のタイプは、アプリケーションが使用する同期モデル プロバイダーによって異なります。Windows フォームを実行している場合は、WindowsFormsSynchronizationContext; WPF; だろうDispatcherSynchronizationContext

その後ReportProgressバックグラウンド スレッドで呼び出すと、前述のインスタンスBackgroundWorkerが内部的に呼び出され、関連するスレッドに操作が非同期的にディスパッチされます。PostSynchronizationContext

Windows フォームでは、これはControl.BeginInvoke呼び出しとして実装されます。WPF ではDispatcher.BeginInvoke呼び出しになります。

于 2012-08-25T12:06:25.680 に答える