0

谁能告诉我为什么在完成 lambda 后会冻结以下内容:

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

...但以下工作按预期工作:

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

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

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

4

1 回答 1

6

我猜你正在调用的调用堆栈进一步向上,Task.Wait或者Task<T>.Result因此导致我在我的博客上描述的死锁问题。你应该await改用。

作为旁注,SuperLongMethod可能应该被分解成CallWebServiceAsyncand DoPostProcessing,并且只有DoPostProcessing应该被包裹在 a 中Task.Run

于 2013-04-12T15:43:58.087 回答