Dispatcher。 Dispatcherは、特定のスレッドの作業項目の優先順位付きキューを維持します。これは、あなたのUIを更新するのに役立ちます。 UIに関連した初期化がたくさんある場合でも、これはあなたに多くの手助けをすることはできません。
Dispatcherは実際にはBackgroundWorkerの代替手段ではありません。ベストプラクティスは、要件に応じてより適切なものを選択することです。たとえば、キューに入れずに何かを実行したい場合、BackgroundWorkerがソリューションです。一方、キューイングが問題ではない場合、Dispatcherは代替手段です。例えば、Dispatcherはスペルチェッカーと構文強調表示機能で使用しています。
WPF Thread Model
すべてのWPFアプリケーションでは、2つの重要なスレッド、 レンダリング用とユーザーインターフェースを管理するための1から始めます。レンダリング スレッドはバックグラウンドで実行される隠されたスレッドなので、通常扱う スレッドのみがUIスレッドです。 WPFでは、ほとんどのオブジェクトがUIスレッドに結び付けられることを が要求します。これは スレッドアフィニティとして知られています。つまり、作成されたスレッド でのみWPFオブジェクトを使用できます。それを他のスレッドで使用すると、 実行時例外がスローされます。 WPFスレッドモデル は、Win32®ベースのAPIと相互運用性が高いことに注意してください。これは、WPFが ホストかHWNDベースのAPI(Windowsフォーム、VisualBasic®、 MFC、またはWin32)によってホストされることを意味します。
スレッドアフィニティは、WPFアプリケーションの優先順位付きメッセージループであるDispatcher クラスによって処理されます。通常、 WPFプロジェクトには、すべてのユーザーインターフェイスの作業がチャネルされる単一のDispatcherオブジェクト(したがって、単一の UIスレッド)があります。
注:
ディスパッチャと他のスレッドの方法 間の主な違いは、ディスパッチャが実際にマルチスレッドではないということです。ディスパッチャ は、正しく機能するには1つのスレッドを必要とするコントロールを制御します。 DispatcherのBeginInvokeメソッドは、遅くとも の実行のためにイベントをキューに入れます(優先順位などによるが、同じスレッド上にある)。
詳細については、thisスレッドを参照してください。
バックグラウンド作業者の場合、ReportProgress()を実装しましたか? http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.reportprogress.aspx –
@Jon Raynor実際には –
@ Oscar:BackgroundWorker:DoWorkはUIを応答不能にしません。おそらく、BackgroundworkerのAsyncCompletedイベントでUIの更新を行っている可能性があります。 backgroundWorkerをデータベースから取得するためだけに使用する場合は、UIをフリーズせずに動作するはずです。 – CharithJ