0

DoWork イベント Eventhandler で ReportProgress() メソッドを呼び出して ProgressChangedEvent イベント ハンドラーを使用して UI を更新できるのに、Dispatcher.BeginInvoke() メソッドを使用して DoworkEvent ハンドラーから UI を更新する必要がある理由を WPF で教えてもらえますか? バックグラウンド ワーカーとディスパッチャに関する私の理解が間違っている場合は、修正してください。

4

2 に答える 2

2

覚えておく必要があるルールが 1 つあります。

UI の更新は、UI スレッドから行う必要があります。

これを念頭に置いて、ディスパッチャとバックグラウンド ワーカーの機能を見てみましょう。

ディスパッチャ ディスパッチャは、BeginInvoke を呼び出すと、ディスパッチャが作成されたスレッドでメソッドを実行するオブジェクトです。アプリケーションのディスパッチャは常に UI スレッドで作成されるため、これは機能します。

バックグラウンド ワーカー バックグラウンド ワーカーは非常に似ていますが、イベント ベースの API を提供します。ReportProgressDoWork メソッド内で呼び出すと、BackgroundWorker は、バックグラウンド ワーカーが作成されたスレッドでイベントを発生させます。したがって、UI スレッドで Background-Worker を作成すると、ProgressChanged イベント ハンドラー内で UI を更新できます。

于 2013-04-21T14:24:23.497 に答える