自定义控件中的多个并行线程
本文关键字:并行 线程 自定义控件 | 更新日期: 2023-09-27 18:27:10
我在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似乎是一个错误的工具,因为我得到了以下异常:
WindowsBase.dll 中首次出现"System.InvalidOperationException"类型的异常
你们建议我怎么做?
我尝试了Dispatcher.BeginInvoke,但它们被一个接一个地调用,而不是并行的。
我需要一个平行的解决方案。提前谢谢。
使用WaitAll等待线程完成并从列表中传递批处理如何?
Task task1 = Task.Factory.StartNew(() => doStuff(list1));
Task task2 = Task.Factory.StartNew(() => doStuff(list2));
Task.WaitAll(task1, task2);
由于您可能正在执行计算密集型任务,请考虑使用后台工作者而不是普通线程/任务。这将使您的DoSomething()
处于后台线程上。