任何人都可以告诉我为什么以下在完成lambda之后会冻结:
return await Task.Run(() =>
{
return SuperLongMethod();
})
......但是以下工作正如预期的那样:
return Task.Run(() =>
{
return SuperLongMethod();
}).GetAwaiter().GetResult();
似乎第一个版本中的Task.Run无法识别lambda已完成。我在我的代码中有其他示例,我使用第一个版本没有问题,所以我不知道有什么区别。
为清楚起见,SuperLongMethod()进行Web服务调用并对结果数据进行大量后处理
答案 0 :(得分:6)
我猜你的呼叫堆栈正在进一步调用Task.Wait
或Task<T>.Result
,从而导致the deadlock issue I describe on my blog。您应该使用await
代替。
作为旁注,SuperLongMethod
应该分为CallWebServiceAsync
和DoPostProcessing
,只有DoPostProcessing
应该包含在Task.Run
中