如何在循环中创建一堆任务

时间:2014-06-20 16:13:28

标签: c#

我有一个包含100个值的列表

我想生成5个线程来处理20个

我的代码基本上是

for (int i = 0; i<5; i++)
{

   Task.Run(() => {
       myMethod(myList.Skip(i * 20).Take(20)));
   });
}

显然因为这会关闭i的价值,所以它可以完全搞砸了。我已经尝试了所有我能想到的东西,以便在宣布任务时捕获值,但我根本没有运气。即使将Task.Run的第一行设置为var localVariable = i;来捕获它也不起作用,它运行方法,每次都是5。

我该如何做到这一点,大概是我想通过传递i的值来创建任务,所以它永远不会看到函数之外但我无法弄清楚如何做到这一点。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

你差不多了,但以及创建局部变量的副本,你需要在你的lambda表达式中使用它:

for (int i = 0; i < 5; i++)
{
   int localCopy = i;
   Task.Run(() => {
       myMethod(myList.Skip(localCopy * 20).Take(20)));
   });
}

如果这不起作用,则问题不是变量捕获 - 它在其他地方。

当然,另一个选择是将Parallel.ForEach与自定义分区程序一起使用,或类似的东西。换句话说,可能有更好的方法来解决问题。

答案 1 :(得分:0)

尝试在任务外设置var localVariable = i