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()
语句后更新视图模型属性.我需要做的就是增加属性值.我怎么做?谢谢你的帮助.
由于属性是一个简单的属性(而不是集合),您应该能够直接设置它.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)
归档时间: |
|
查看次数: |
1441 次 |
最近记录: |