0

私は他の人によって書かれたこのコードに取り組んでいます。DoWork から Dispatcher.Invoke を呼び出すバックグラウンド ワーカーが含まれています。

私の問題は、Dispatcher.Invoke が完了する前に BackgroundWorkerCompleted が発生すると思うことです。あれは正しいですか?

Dispatcher.Invoke は新しいスレッドを開始しますか、それともメイン スレッドで開始しますか?

Dispatcher と Backgroundworker を混在させるのは悪い考えですか? 私が見つけたサンプルは、そのうちの 1 つだけを使用しているようです。

4

1 に答える 1

1

私の問題は、Dispatcher.Invoke が完了する前に BackgroundWorkerCompleted が発生すると思うことです。あれは正しいですか?

いいえ、それは正しくありません。

Dispatcher.Invoke は新しいスレッドを開始しますか、それともメイン スレッドで開始しますか?

いいえ、UI スレッドでコードを実行します。したがって、クロススレッド例外が発生するのを防ぎます。通常、GUI の内容を変更するために使用されます。

Dispatcher.Invokeを参照してください。

WPF では、DispatcherObject を作成したスレッドのみがそのオブジェクトにアクセスできます。たとえば、メイン UI スレッドからスピンオフされたバックグラウンド スレッドは、UI スレッドで作成された Button の内容を更新できません。バックグラウンド スレッドが Button の Content プロパティにアクセスするには、バックグラウンド スレッドが UI スレッドに関連付けられた Dispatcher に作業を委任する必要があります。これは、Invoke または BeginInvoke を使用して実行されます。Invoke は同期で、BeginInvoke は非同期です。操作は、指定された DispatcherPriority で Dispatcher のイベント キューに追加されます。

于 2013-04-03T05:18:44.690 に答える