.Net async ForEach()委托抛出任务取消异常

时间:2016-03-30 12:15:38

标签: c# .net asynchronous

我有以下c#代码:

list.ForEach(async item =>
await doSomething(item));

有时我收到TaskCancelledException。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

ForEach内的委托类型为Action<T>

Action<T>的返回类型为void,表示您的async item => await doSomething(item) lambda转化为

async void doSomething(T item)。将asyncvoid一起使用意味着它将被异步调用,而不会在下一次迭代发生之前等待。

您应始终将asyncTask返回类型一起使用。

在此示例中,您应该使用常规的foreach

所以你的例子看起来像是:

foreach(var item in list) 
{
  await doSomething(item);
}