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
价值的不确定性。
怎么做?
问题在于“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)
归档时间: |
|
查看次数: |
5624 次 |
最近记录: |