2009-08-21 6 views
0

私はコントロールのディスパッチャオブジェクトに精通していますが、MVVMのシナリオでは問題は解決しません。WPF MVVMでは、UIスレッドでコールバックを実行するバックグラウンドタスクを生成する方法は?

私は、VM上のメソッドを呼び出してスレッドを生成し、スレッドが完了すると(バックグラウンドワーカーはこのために良いかもしれません)、コールバックを発生させるUIコマンドを持っていますがトリックは、そのコールバックが観測可能なコレクションを変更するので、UIスレッドでこのコールバックをどのように呼び出すことができますか?

答えて

3

UIスレッドに関連付けられたDispatcherを使用してください。通常base ViewModel classにはDispatcherがすべてのサブクラスに公開されます。次に、あなたのVMのような何かをするだろう:

Dispatcher.Invoke((ThreadStart) delegate 
{ 
    //this code executes on the UI thread 
}); 
1

コールバックメソッドがDispatcherにアクセスできるフォームまたはコントロールにある場合は、CheckAccess()を呼び出すことができます。あなたが同じスレッド上にいる場合は、作業をしてください。それ以外の場合は、ディスパッチャを使用してデリゲートを実行中の関数にポストし、正しいスレッド上に配置します。

1

バックグラウンドワーカーは、このために効果的です。

UIスレッドで変更を公開するには、コールバックをディスパッチャに関連付け、dispatcher.Invokeを使用してオブザーバブルコレクションを実際に変更するだけです。

これは、ViewModelクラスがディスパッチャへの参照を保持するようにするために、ほとんどの場合非常に便利な理由です。このため、このパターンは非常に簡単に実装できます。

0

それはに基づいて、適切なスレッド上でRunWorkerCompletedイベントを発生させるためBackgroundWorkerは、このために完璧になる(WPFで、現在のディスパッチャに依存して、)SynchronizationContext

別の方法として、非同期操作を実行する前に現在のディスパッチャ(Dispatcher.CurrentDispatcher)を保存して、コールバックを呼び出すために使用することができます。

私は観察可能なコレクションのこの種の問題を処理するためのクラスを作成しました。あなたはそれを見つけることができますhere

関連する問題