2011-08-29 11 views
7

バックグラウンドスレッドでMVVMビューモデルProgressのプロパティを変更するにはどうすればよいですか?MVVMのバックグラウンドスレッドの進行通知?

Task.Factory.StartNew()Parallel.ForEach()を使用して、バックグラウンドスレッドでタスクを実行するMVVMアプリケーションを作成しています。私はthis articleを参考にしています。 fileListは、ファイルのリストがある

Task.Factory.StartNew(() => DoWork(fileList, viewModel)); 

が処理され、viewModelProgressプロパティを持つビューモデルである:これまでのところ、私のコードは次のようになります。 DoWork()方法はこれまでのところ、次のようになります。

private object DoWork(string[] fileList, ProgressDialogViewModel viewModel) 
{ 
    Parallel.ForEach(fileList, imagePath => ProcessImage(imagePath)); 
} 

ProcessImage()方法は、実際の画像処理を行います。ビューモデルのProgressプロパティは、バックグラウンドプロセスの開始直前に表示されるダイアログの進行状況バーにバインドされます。

Parallel.ForEach()ステートメントの各繰り返しの後で、ビューモデルProgressプロパティを更新したいとします。私がする必要があるのは、プロパティ値をインクリメントすることだけです。それ、どうやったら出来るの?ご協力いただきありがとうございます。

+0

「進行」はint、float、またはdoubleですか? –

答えて

7

プロパティは単純なプロパティであり、コレクションではないため、直接設定することができます。 WPFは自動的にUIスレッドへのマーシャリングを処理します。

しかし、競合状態を回避するには、「完了」カウンタの増分を明示的に処理する必要があります。これは次のようなものになります。

private object DoWork(string[] fileList, ProgressDialogViewModel viewModel) 
{ 
    int done; // For proper synchronization 
    Parallel.ForEach(fileList, 
     imagePath => 
     { 
      ProcessImage(imagePath)); 
      Interlocked.Increment(ref done); 
      viewModel.Progress = done; 
     } 
} 
+0

もう一度、感謝リード!私はこれをたくさん言っているようです!受け入れられ+1。 –

関連する問題