なぜコントロールを作成したスレッドがそれを更新できるスレッドなのですか?なぜMSは、ロックやその他のスレッド同期技術を使用して複数のスレッドを持つUIコントロールのプロパティを読み書きすることができないのですか?WPFのUIコントロールにThread Affinityがあるのはなぜですか?
答えて
MSDNあたりの簡単な説明は、WPFのスレッドモデルは、スレッドの親和性を持つシングルスレッド実行の既存のがUser32 スレッドモデルと同期して維持した
です。このた相互運用性のため 主な理由 - OLE 2.0、 クリップボード、およびInternet Explorerのようなシステムは、すべての
親和性(STA)の実行シングルスレッドを必要と長い説明はこれです:
ほとんどWPFのオブジェクトはDispatcherObjectから派生しています.DispatcherObjectは、同時実行とスレッド化を扱うための基本的な構造を で提供します。 WPFは、ディスパッチャによって実装されたメッセージングシステムに基づいて です。これは、おなじみのWin32メッセージポンプとよく似ています; ;実際、WPFディスパッチャ は、クロススレッドコールを実行するためにUser32メッセージを使用します。ディスパッチャスレッドの親和性 -
は本当にWPFで 並行性を議論する際に理解するには、2つの中心的な概念があります。
WPFの設計段階で、目標は実行のスレッド に移動することでしたが、スレッド以外の「結合された」モデルに移行することが目的でした。スレッド コンポーネントが実行中の スレッドのIDを使用してある種の状態を格納すると、親和性が発生します。これの最も一般的な形式は、 に状態を格納するためにスレッドローカルストア(TLS)を使用することです。スレッドの親和性 は、実行の各論理スレッドがメモリ 集中的になることができ、オペレーティング・システムで唯一 物理スレッドによって所有されている必要があります。最後に、WPFのスレッドモデルは スレッドの親和性を持つシングルスレッド実行の 既存のUSER32スレッドモデルと同期して維持しました。その主な理由は、相互運用性だった - OLE 2.0、クリップボード、およびInternet Explorerなどの システムすべてが シングルスレッドの親和性(STA)の実行が必要です。
STAスレッドを持つオブジェクトがあると、 スレッド間で通信し、正しい スレッドであることを検証する方法が必要です。ここにディスパッチャの役割があります。ディスパッチャは、 基本メッセージディスパッチシステムであり、複数の優先キューがあります。メッセージの としては生の入力通知(マウスが移動)、 フレームワーク関数(レイアウト)、またはユーザコマンドを(この方法を実行する)が挙げられます。 はDispatcherObjectから派生させることによって、あなたは STA挙動を有するCLRオブジェクトを作成し、作成 時にディスパッチャへのポインタを与えられます。
あなたはhere
は個人的に私はロックとスレッドの同期技術を使用することの上にWPFのシングルスレッドモデルを好む記事全文を読むことができます。Dispatcherは、大部分の小さなバックグラウンドプロセスを処理するメインUIスレッドdifferent priority levelsにメッセージを渡すために使用できます。重い処理が必要な場合は、独自のバックグラウンドスレッドを作成することができます。
WPFは、すべてのUIツールキットのように、メッセージループをポンピングすることによって機能します。メッセージはいつでも来てコントロールに影響するので、グローバルロックが必要です。また、エラーの発生を少なくするために、ロックの下でデリゲートを呼び出す関数が必要になる場合があります。おそらく、このような何か:
Dispatcher.Invoke(Delegate, Object())
これは、代わりにグローバルロックを取得するUIスレッドにマーシャリングされますという事実だけで、実装の詳細です。
本当に短い答えは、WPFは開発者のための光沢のあるフレンドリーなインターフェイスで、古いレガシーのものだけで構築されていることです。したがって、STAモデル。 – Andy
+1。マーケティングは暴れた! –
- 1. WPF UIコントロールに対するマルチスレッドアクセスのオーバーヘッドはなぜですか?
- 2. WPF UIコントロールの標準命名規則はありますか?
- 3. Azure WebサイトでAAR Affinityを無効にしないのはなぜですか?
- 4. なぜTasks、Thread、ThreadPoolの間にパフォーマンスの相違があるのですか?
- 5. WPF:なぜ複数のWindowsFormsHostでUIが低速になるのですか?
- 6. デザインUIのWPFコントロールを移動する
- 7. WPFコントロールの一部のプロパティにアクセスできないのはなぜですか?
- 8. 別のUIスレッドでのWPFコントロール?
- 9. WPFオブジェクトをあるコントロールから別のコントロールに渡す
- 10. std :: threadなぜオブジェクトが2回コピーされるのですか?
- 11. WPFのWrapPanelは、javascript/CSS用のUIコントロールを好みますか?
- 12. Silverlight UI Thread Freezing
- 13. WPF TreeViewコントロールがSelectorではなくItemsControlから継承するのはなぜですか?
- 14. PCのコントロールのスケーリングが異なるのはなぜですか?
- 15. WPF/XAMLでコントロールのトリガの完全なリストはどこにありますか?
- 16. WPFグリッド内の枠線のスパンが原因でUIフリーズが発生するのはなぜですか?
- 17. デザイン時にWPFコントロールのコードビハインドが実行されないのはなぜですか?
- 18. プログラム化されたコード化UIテストでWPFコントロールが見つからない
- 19. WPFコントロールは、コレクションがコントロールの背景
- 20. UIスレッドからSerialDevice.FromIdAsyncを開く必要があるのはなぜですか?
- 21. コントロールがあるフォームにフォーカスがあるときにフォーム(またはコントロール)キーダウンイベントが発生しないのはなぜですか?
- 22. Wpf GridViewでは、コントロールを1つのアイテム内の別のコントロールにバインドする方法はありますか。
- 23. TextBoxにフォーカスがあるときにWPFグリッドの可視性が遅くなるのはなぜですか?
- 24. WPFのコントロールを「クリックスルー」する方法はありますか?
- 25. WPFでコントロールを「アンラップ」する方法はありますか?
- 26. 標準ライブラリWPFコントロールのギャラリーはどこにありますか?
- 27. 親ページにoutputcacheディレクティブがあるときに、コントロールのロードイベントが呼び出されるのはなぜですか?
- 28. WPFアプリケーションでサウンドが途切れるのはなぜですか?
- 29. BackgroundWorkerのは、WPFのUIが
- 30. GetSafeHwnd()がActiveXコントロールでゼロを返すのはなぜですか?
MS回答on msdn "最終的に、WPFのスレッドモデルは、スレッド親和性を持つシングルスレッド実行の既存のUser32スレッドモデルと同期していました。これの主な理由は、OLE 2.0、クリップボード、 Internet Explorerはすべて、シングルスレッドアフィニティ(STA)の実行を必要とします。 – Andy