Task.Run冻结

时间:2013-04-12 15:37:20

标签: c# task-parallel-library .net-4.5 async-await c#-5.0

任何人都可以告诉我为什么以下在完成lambda之后会冻结:

        return await Task.Run(() =>
        {
            return SuperLongMethod();
        })

......但是以下工作正如预期的那样:

        return Task.Run(() =>
        {
            return SuperLongMethod();
        }).GetAwaiter().GetResult();

似乎第一个版本中的Task.Run无法识别lambda已完成。我在我的代码中有其他示例,我使用第一个版本没有问题,所以我不知道有什么区别。

为清楚起见,SuperLongMethod()进行Web服务调用并对结果数据进行大量后处理

1 个答案:

答案 0 :(得分:6)

我猜你的呼叫堆栈正在进一步调用Task.WaitTask<T>.Result,从而导致the deadlock issue I describe on my blog。您应该使用await代替。

作为旁注,SuperLongMethod应该分为CallWebServiceAsyncDoPostProcessing,只有DoPostProcessing应该包含在Task.Run