如何在后台线程上修改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()
属性。我需要做的就是增加属性值。我怎么做?谢谢你的帮助。
答案 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;
}
}