【问题标题】:C# Splitting loop on multiple threadsC#在多个线程上拆分循环
【发布时间】:2014-06-08 15:24:23
【问题描述】:

我有一个任务,它本质上是遍历一个集合并成对地对它们进行操作(对于 int i = 0; i

所以我想做的基本上是替换:

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)。

标签: c# multithreading parallel-processing


【解决方案1】:

试试Parallel.For会省很多事。

【讨论】:

  • 我似乎无法让它工作。我尝试运行一个循环来触发这种线程行为 18 次,但是在 1-7 次(非常快)运行后,程序似乎卡在了某个地方。
  • 说真的,这 x 100000
【解决方案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)
});

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

This 是一篇很好的帖子,它解释了其中一个差异

【讨论】:

  • 到目前为止,这种方法没有运气。很多弯弯曲曲的红线。它表示无法推断 ForAll() 调用的参数类型。是因为它是自定义对象而不是原始对象吗?
  • 没关系,只要将[ListContainingType] 替换为列表中包含的类型,就可以了。
  • 我做到了。但目前我没有可用的代码。稍后会看看。也许我犯了其他一些愚蠢的错误。
  • 知道了,当你得到它时,继续用你尝试过的方法更新你的问题,这样我们就可以看到到底发生了什么。
猜你喜欢
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 2023-02-17
  • 2015-11-14
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多