考虑以下代码

attempt = 0;
for (int counter = 0; counter < 8; counter++)
{
    if (attempt < totalitems)
    {
        Tasklist<output>.Add(Task.Run(() =>
        {
            return someasynctask(inputList[attempt]);
        }));
    }
    else
    {
        break;
    }
    attempt++;
}
await Task.WhenAll(Tasklist).ConfigureAwait(false);


例如,我想有8个并发任务,每个任务同时处理不同的输入,并在所有任务完成时最终检查结果。
因为我不是在等待Task.Run()的完成,而是在开始任务之前尝试增加,并且在任务启动时,所以输入列表中的某些项目可能未被处理或被处理两次或更多次(由于不确定性)尝试价值。

怎么做?

最佳答案

问题在于使用“ lambda”:在执行过程中达到Task.Run(() => return someasynctask(inputList[attempt]));时,捕获变量attempt而不是其值(即,它是一个“闭包”)。因此,当执行lambda时,将使用该特定时刻的变量值。

只需在lambda之前添加变量的临时副本,然后使用它即可。例如。

if (attempt < totalitems)
{
    int localAttempt = attempt;
    Tasklist<output>.Add(Task.Run(() =>
    {
        return someasynctask(inputList[localAttempt]);
    }));
}

09-05 02:48