C#多线程分割循环

4

我有一个任务,基本上是遍历一个集合,并对它们成对进行操作(例如,for 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();

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

但是我认为线程在完成后会自动终止?是的,线程确实完成了。DoOperation()方法基本上只是一个for循环。

那么我在这里没有理解什么呢?


你可以对下半部分使用.Take(halfCount),然后在上半部分使用.Skip(halfCount)。 - misthema
2个回答

5

我似乎无法让它正常工作。我尝试运行一个循环,触发这个线程行为18次,但在1-7(非常快)次运行后,程序似乎卡在某个地方了。 - Christofer Ohlsson
认真地,这个 x 100000。 - sircodesalot

2

为了更详细地解释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)
});

这将让您在单独的线程上为列表中的每个项目执行操作。它更简单,因为它为您处理了所有的“多线程性”。

这篇文章是一篇很好的文章,解释了它们之间的一个区别。


到目前为止,这种方法还没有成功。有很多波浪形的红线。它说无法推断ForAll()调用的参数类型。是因为它是自定义对象而不是原始对象吗? - Christofer Ohlsson
只要您将“ [ListContainingType]”替换为列表中所包含的类型,那么这就无关紧要了,接着它应该可以工作。 - Ben Black
我已经做了。但是目前没有代码可用。稍后会查看一下。也许我犯了其他愚蠢的错误。 - Christofer Ohlsson
明白了,当你弄清楚了,请更新你的问题并告诉我们你尝试了什么,这样我们就可以看到具体发生了什么。 - Ben Black

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接