MVVM中的后台线程进度通知?

时间:2011-08-29 23:54:00

标签: c# wpf multithreading mvvm

如何在后台线程上修改MVVM视图模型Progress属性?

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

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

其中fileList是要处理的文件列表,viewModel是具有Progress属性的视图模型。到目前为止,DoWork()方法看起来像这样:

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

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

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

1 个答案:

答案 0 :(得分: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;
       }
}