如何在循环中创建一堆任务
本文关键字:一堆 任务 创建 循环 | 更新日期: 2023-09-27 18:09:48
我有一个100个值的列表
我想生成5个线程,每个线程处理20个
我的代码基本上是for (int i = 0; i<5; i++)
{
Task.Run(() => {
myMethod(myList.Skip(i * 20).Take(20)));
});
}
很明显,因为它关闭了i的值,它完全可以把它搞砸。我已经尝试了我能想到的所有方法来获取任务声明时的值,但我一点也不幸运。甚至设置任务的第一行。运行到var localVariable = i;
捕获它不工作,它运行该方法并且每次i为5。
我如何做到这一点,假设我想通过传递I的值来创建任务,这样它就不会在函数之外看到,但我不知道如何做到这一点。
任何想法?
差不多完成了,但是和创建本地变量的副本一样,您需要在lambda表达式中使用它:
for (int i = 0; i < 5; i++)
{
int localCopy = i;
Task.Run(() => {
myMethod(myList.Skip(localCopy * 20).Take(20)));
});
}
如果这不起作用,那么的问题不是变量捕获-它在其他地方。
当然,另一种选择是使用Parallel.ForEach
和自定义分区器,或者类似的东西。换句话说,很可能有更好的方法来解决这个问题。
尝试在任务外设置var localVariable = i