在多线程上分割循环

本文关键字:循环 分割 多线程 | 更新日期: 2023-09-27 18:07:38

我有一个任务,本质上是循环遍历一个集合,并成对地对它们进行操作(for int I = 0;我& lt;限制;i+=2等)因此,我看到的大多数关于线程循环的建议都使用了某种foreach机制。但这对我来说似乎有点棘手,看看我是如何使用这种成对操作的方法的。

那么我要做的就是替换:

DoOperation(list.Take(numberToProcess));

Thread lowerHalf = new Thread(() => => DoOperation(list.Take(numberToProcess/2)));
Thread lowerHalf = new Thread(() => => DoOperation(list.getRange(numberToProcess/2, numberToProcess));
lowerHalf.Start();
upperHalf.Start();

这似乎完成了工作,但它非常慢。每次迭代都比前一次慢,当我调试时,Thread视图显示了一个不断增长的线程列表。

但是我的印象是线程在完成后终止自己?是的,线程确实完成了。DoOperation()方法其实就是一个for循环。

我不明白的是什么?

在多线程上分割循环

尝试并行。

要进一步解释pranitkothari的答案并给出一个不同的例子,可以使用

list.AsParallel().ForAll(delegate([ListContainingType] item) {
    // do stuff to a single item here (whatever is done in DoOperation() in your code
    // except applied to a single item rather than several)
});

例如,如果我有一个列表字符串,它将是

List<String> list = new List<String>();
list.AsParallel().ForAll(delegate(String item) {
    // do stuff to a single item here (whatever is done in DoOperation() in your code
    // except applied to a single item rather than several)
});

这将允许您在单独的线程上对列表中的每个项执行操作。它更简单,因为它为你处理所有的"多线程"。

这个是一个很好的帖子,它解释了它们之间的一个区别