将Parallel.ForEach与WPF Dispatcher一起使用......你如何让这两者相互配合?

时间:2012-05-15 00:44:23

标签: wpf progress-bar parallel-processing dispatcher ui-thread

我可以在我的ViewModel类中执行以下操作:

var inc = 100.0d / total;

Parallel.ForEach(enumeration, new ParallelOptions { MaxDegreeOfParallelism = 8 },
    item =>
    {
        //Do Parallel Tasks

        lock (ProgressLock)
        {
            WorkProgress += inc; //This raises a PropertyChanged event (binding).
        }
    });

我遇到的麻烦是让每个并行任务都是UI响应。任何援助都会很棒。谢谢!

2 个答案:

答案 0 :(得分:2)

您无法在调度程序线程上运行Parallel.ForEach。它将阻塞线程,直到整个过程完成,此时,绑定将更新。

如果您需要在执行时更新绑定,则可以将整个进程包装到后台任务中。只要WorkProgress是一个简单的数字,如果绑定在后台线程中设置,它就应该具有属性。

这可以很简单:

Task.Factory.StartNew( () =>
{
  Parallel.ForEach(enumeration, new ParallelOptions { MaxDegreeOfParallelism = 8 },
   item =>
   {
    //Do Parallel Tasks

    lock (ProgressLock)
    {
        WorkProgress += inc; //This raises a PropertyChanged event (binding).
    }
   });
});

答案 1 :(得分:0)

你也不能使用多线程,同时也要坚持一个线程。

相反,您可以使用Dispatcher在UI线程上调用属性设置器。