我在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,但它们是一个接一个地调用而不是并行调用。
我需要一个并行解决方案。提前谢谢。
答案 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()
置于背景线程中。