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

本文关键字:并行 线程 自定义控件 | 更新日期: 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()处于后台线程上。