Task.Run(),传递参数给

Hes*_*sam 1 c# concurrency asynchronous task

考虑以下代码:

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);
Run Code Online (Sandbox Code Playgroud)

例如,我想要 8 个并发任务,每个任务同时处理不同的输入,最后在所有任务完成后检查结果。因为我没有Task.Run() attempt在任务开始之前等待增加的完成,并且当任务开始时, 中可能有一些项目inputList没有被处理或处理了两次或更多次(因为attempt价值的不确定性。

怎么做?

Ber*_*ler 5

问题在于“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]);
    }));
}
Run Code Online (Sandbox Code Playgroud)