我正在为我的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之后,使用Result
与await
有什么区别吗?该任务已在该实例处完成,因此我认为性能应该相同。但是我对异常处理有点担心。我认为Result
不会传播异常,但await
会传播。
这正确吗?
答案 0 :(得分:1)
不使用.Result,请始终使用await。
请注意.Result can cause deadlocks和可能导致应用程序中某些无法预料的行为。
然后的唯一方法是进行进程转储,然后在procdump中分析转储。相信我,调试将非常困难。
请找到有关async programming at this blog.
的最佳做法关于异常处理,在本博客中提到:
每个任务都会存储一个例外列表。当您等待任务时, 重新抛出第一个异常,因此您可以捕获特定的异常 类型(例如InvalidOperationException)。但是,当你 使用Task.Wait或Task.Result同步阻止任务,所有 异常被包装在AggregateException中并抛出。
希望这会有所帮助。