2009-09-04 5 views

答えて

4

編集。

実行中のタスクがある場合は、BackGroundWorkerを使用してバックグラウンドスレッドに委任し、ディスパッチャを使用してメッセージをUIに戻す必要はありません。 This is a very good article.


非常に広い質問です。 WPF Architectureでここから始めることをお勧めします。 WPFで

ほとんどのオブジェクトは 並行性とスレッドを扱うための 基本的な構築物を提供する DispatcherObjectに、由来します。 WPFは で、ディスパッチャによって実装されたメッセージングシステム に基づいています。この は、使い慣れたWin32 メッセージポンプとよく似ています。実際、WPF ディスパッチャは、 のスレッド間呼び出しを実行するためにUser32メッセージを使用します。ディスパッチャスレッド 親和性 -

は本当にWPFで同時実行 を議論する際に が理解への2つのコアコンセプトがあります。 WPFの設計段階

、 目標は 単一の実行スレッドに移動しましたが、非スレッド 「アフィニティ」モデル。スレッドアフィニティ は、実行中のスレッドのIDが のIDを使用して に状態を保存すると発生します。最も多くの の一般的な形式は 状態を格納するために スレッドローカルストア(TLS)を使用することです。スレッドアフィニティは、 実行の各論理スレッドが、 メモリ集中型になることができる オペレーティングシステム内の1つの物理スレッドだけが所有する であることを要求します。結局のところ、WPFの スレッドモデルは、 の既存のUser32スレッドモデル スレッドのシングルスレッド実行 アフィニティと同期していました。この の主な理由は、 OLE 2.0、クリップボード、およびインターネット エクスプローラなどのすべてのシステムで、単一スレッド アフィニティ(STA)実行が必要な相互運用性でした。

あなたがSTA スレッドを持つオブジェクトを持っていることを考えると、あなたは は、スレッド間で通信する方法、そしてあなたが正しい スレッド上にある 検証を必要としています。ここには ディスパッチャの役割があります。ディスパッチャは基本的な メッセージディスパッチシステムであり、 複数優先キューがあります。メッセージの例 には、生の入力 通知(マウス移動)、フレームワーク 機能(レイアウト)、またはユーザコマンド (このメソッドの実行)が含まれます。 DispatcherObjectから を派生させると、STAの動作を持つ CLRオブジェクトが作成され、 には作成時に ディスパッチャーへのポインタが渡されます。

+1

hmm ..私の疑いは、UIの背後で長時間実行されているプロセスが起きているときです。その時、WPF UIは応答しないか、ディスパッチャスレッドを使用して解決できますか? –

関連する問題