自定义控件中的多个并行线程

时间:2014-10-20 08:02:59

标签: c# wpf multithreading

我在wpf里面,我有一个自定义控件

public class MyListControl : ListBox
{
   ...

现在我想通过Items运行,但使用4个不同的线程。一个线程应该占据列表的第一部分,第二个线程应该在第二部分应用计算,依此类推......

看看这个伪代码:

var originalSource = this.ItemsSource.Cast<object>().ToList();
int part = originalSource.Count / 4;

Task.Factory.StartNew(..
    DoSomething(originalSource.Take(part));

Task.Factory.StartNew(..
    DoSomething(originalSource.Skipt(part).Take(part), ...);

Task.Factory.StartNew(..
    DoSomething(originalSource.Skip(part * 2).Take(part), ... );

Task.Factory.StartNew(..
    DoSomething(originalSource.Skip(part * 3).Take(part), ...); ...

总结一下,列表分为4个部分,4个不同的线程将加速计算。

现在的问题是我该怎么做?

我无法在ViewModel中执行此操作,它必须位于自定义控件内!

Task.Factory.StartNew似乎是错误的工具,因为我得到了例外:

类型&#39; System.InvalidOperationException&#39;的第一次机会异常。发生在WindowsBase.dll

你们建议我做什么?

我尝试过Dispatcher.BeginInvoke,但它们是一个接一个地调用而不是并行调用。

我需要一个并行解决方案。提前谢谢。

2 个答案:

答案 0 :(得分:0)

如何使用WaitAll等待线程完成并从列表中传递批次?

Task task1 = Task.Factory.StartNew(() => doStuff(list1));
Task task2 = Task.Factory.StartNew(() => doStuff(list2)); 
Task.WaitAll(task1, task2); 

答案 1 :(得分:-1)

由于您可能正在执行计算密集型任务,因此请考虑使用Background Worker而不是正常的线程/任务。这会将您的DoSomething()置于背景线程中。