2009-08-16 12 views
14

これはMSDNの例を使用しようとしましたが、Windowsフォームにしか適用されないようです。たとえば、.InvokeRequiredを使用する方法は、Windowsフォームコントロールに依存しますが、このメソッドはWPFコントロールでは使用できません。 Backgoundワーカー方法は、同様にInvalidOperationExceptionをスローします - 別のスレッドがそれ を所有しているので、呼び出し元のスレッドがこの オブジェクトにアクセスすることはできませんスレッドセーフな方法でC#WPFコントロールにアクセスするには?

これはどのようにWPFのコンテキストで行うことができますか?

答えて

33

Dispatcher.Invokeメソッド(または非同期の同等のDispatcher.BeginInvoke)を使用して、呼び出しをメインのWPF UIスレッドにマーシャリングします。

クラスにはDispatcherプロパティが含まれています。これは、このクラスを継承するすべてのコントロールやその他のオブジェクトがWinFormsと同様の方法でこのプロパティを提供することを意味します。さらに、Applicationオブジェクトはディスパッチャへのアクセスを提供します。

this.Dispatcher.Invoke((Action)(() => 
    { 
     ... 
    })); 
+0

おかげで、完璧に働いた:

使用例は、以下の(Window/UserControlの中にコードビハインド)かもしれません。あなたが何をする必要があるかを知っているときに、WPFでは実際にフォームを勝つよりもはるかに単純に見えます; –

+0

問題ありません。そして、WPFは確かに優れたスレッド/メッセージポンプモデルを持っています。 – Noldorin

関連する問題