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

本文关键字:一堆 任务 创建 循环 | 更新日期: 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