在Task.IsCompleted之后,哪个更好:等待或结果

时间:2019-03-20 19:21:33

标签: c# async-await task

我正在为我的http请求使用一个简单的超时代码。我知道了

private async Task<HttpResponseMessage> ExecuteIOTask(Task<HttpResponseMessage> ioTask, int timeout)
    {
        var timeoutTask = await Task.WhenAny(Task.Delay(timeout), ioTask);

        if (ioTask.IsCompleted)
            return ioTask.Result;

        throw new TimeoutException();
    }

在IsCompleted之后,使用Resultawait有什么区别吗?该任务已在该实例处完成,因此我认为性能应该相同。但是我对异常处理有点担心。我认为Result不会传播异常,但await会传播。

这正确吗?

1 个答案:

答案 0 :(得分:1)

不使用.Result,请始终使用await。

请注意.Result can cause deadlocks和可能导致应用程序中某些无法预料的行为。

然后的唯一方法是进行进程转储,然后在procdump中分析转储。相信我,调试将非常困难。

请找到有关async programming at this blog.

的最佳做法

关于异常处理,在本博客中提到:

  

每个任务都会存储一个例外列表。当您等待任务时,   重新抛出第一个异常,因此您可以捕获特定的异常   类型(例如InvalidOperationException)。但是,当你   使用Task.Wait或Task.Result同步阻止任务,所有   异常被包装在AggregateException中并抛出。

希望这会有所帮助。