2011-08-29 96 views
7

如何修改MVVM视图模型Progress在后台线程上完成工作的属性?MVVM中的后台线程进度通知?

我正在使用Task.Factory.StartNew()Parallel.ForEach()创建一个在后台线程上执行任务的MVVM应用程序。我使用this article作为指导。到目前为止,我的代码看起来是这样的:

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

哪里fileList是文件列表进行处理,并viewModelProgress属性视图模型。该DoWork()方法是这样的,到目前为止:

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

ProcessImage()方法执行实际的图像处理。视图模型的Progress属性绑定到刚刚在后台进程开始之前显示的对话框中的进度条。

我想在Parallel.ForEach()声明的每次迭代之后更新视图模型Progress属性。我需要做的就是增加属性值。我怎么做?谢谢你的帮助。

+0

'Progress'只是一个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。 –