我有一个包含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的值来创建任务,所以它永远不会看到函数之外但我无法弄清楚如何做到这一点。
有什么想法吗?
答案 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
。