2011-01-26 22 views
1

WPFでマルチスレッドUIのコードサンプルをいくつか見ましたが、それぞれのウィンドウが独自のUIスレッドで実行される複数のウィンドウを使用しています。私は興味があります - 埋め込まれたコントロールでこれを達成する方法はありますか?WPFマルチスレッドUI - ユーザーコントロール

たとえば、私はusercontrol1とusercontrol2の両方がWindow1に組み込まれているとします。 Usercontrol1が回転を開始し、メインのUIスレッドをブロックします。ウィンドウとユーザコントロール2が実行されます。 usercontrol1がブロックしても、Window1 + usercontrol2がまだ応答していても、そのようにする方法はありますか?

私たちはusercontrol1の開発者をコントロールしていないと仮定しましょう。コントロールを動作させるように指示することはできません。

また、usercontrol1 + 2間のデータ交換が必須であるとします。

アドインのようなものを調べるべきですか?

答えて

1

他のスレッドでコントロールを「実行」することはできません(Winformsの場合と同様に、コントロール自体を作成して最上位の親と同じスレッドで実行する必要があります)。からユーザーコントロールからの別のスレッドのアクションDispatcherInvokeを確実に使用して、コントロール自体に直接的な影響を与える操作を確実に行わなければなりません。しかし、後ろ側の処理は別のスレッドで完全に行うことができます。 Dispatcherを介して呼び出されなければならないのは、UIの物理的な更新だけです。

EDIT:質問が編集された後、いいえ、特定のコンポーネントが実行するすべての「作業」を別のスレッドに移動する方法はありません。問題のコンポーネントの開発を制御できない場合は、開発者の慈悲とコード実行を決定します。

+0

これは、別のappdomainにあるアドインとどのように機能しますか? – j03m

+0

なぜ、コメントするのが気になる?これは、私が知っている限り、正解です。 –

+0

@ Dr.HappyPants:あなたは何を意味するのか分かりません。別のAppDomainで動作しているものと通信することについて話していますか?あなたは、あなたが意味することのより具体的な例を挙げることができますか? –

0

DispatcherObjectを継承している視覚(Window)があります。単一のスレッドがオブジェクトメソッドとプロパティにアクセスしているSTAスレッドモデルとして設計されています。

そのため、両方のコントロールをWindowと同じスレッドで作成する必要があります。

コントロール間でデータを交換する必要がある場合、コントロールの開発者を制御していない場合は、PRISMまたは他のMVVMフレームワークの使用を検討します。プリズムにはEventAggregatorがあります。これは、基本的にサブスクライバーパブリッシャーのパターンです。あなたのUserControl1は何かを公​​開することができ、サブスクライブされている場合はそれを受け取ることができます。

関連する問題