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

Dav*_*man 7 c# wpf multithreading mvvm

如何修改MVVM视图模型Progress属性以在后台线程上完成工作?

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

Task.Factory.StartNew(() => DoWork(fileList, viewModel));
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ree*_*sey 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;
       }
}
Run Code Online (Sandbox Code Playgroud)