C#在多个线程上分裂循环

时间:2014-06-08 15:24:24

标签: c# multithreading parallel-processing

我有一个基本上循环遍历集合的任务,并成对对它们进行操作(对于int i = 0; i< limit; 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视图显示了一个不断增长的Threads列表。

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

那么我在这里不理解的是什么?

2 个答案:

答案 0 :(得分:4)

尝试Parallel.For这将节省大量工作。

答案 1 :(得分:1)

要解释一下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)
});

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

This是一篇很好的文章,解释了其中的一个差异