C# 任务完成后,什么更好:等待还是结果
我正在为我的http请求编写一个简单的超时代码。我知道了C# 任务完成后,什么更好:等待还是结果,c#,async-await,task,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.IsCompl
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();
}
private async Task ExecuteIOTask(任务ioTask,int超时)
{
var timeoutTask=wait Task.whenny(Task.Delay(timeout),ioTask);
如果(ioTask.IsCompleted)
返回任务结果;
抛出新的TimeoutException();
}
完成后,使用Result
与wait
是否有任何区别?该任务已经在该实例中完成,因此我认为性能应该是相同的。但我有点担心异常处理。我认为Result
不会传播异常,但wait
会
这是否正确?不要使用。结果,始终使用等待 请注意,和可能会在应用程序中导致一些不可预测的行为 唯一的方法是获取进程转储,然后在procdump中分析转储。相信我,调试将会非常困难 请查找有关的最佳实践 就异常处理而言,本博客中提到: 每个任务都将存储一个异常列表。当您等待任务时 第一个异常被重新抛出,因此您可以捕获特定的异常 类型(例如InvalidOperationException)。然而,当你 使用Task.Wait或Task.Result同步阻止任务,所有 异常被包装在AggregateException中并抛出
希望这有帮助。如果
IsCompleted
为真,那么Result
如何导致死锁?你能举一个这样的场景的例子吗?这个答案并没有回答被问到的问题,那就是“我认为结果不会传播例外,而是等待意志。这是正确的吗?”@ EricLippert -答案是遵循最佳实践,并且该声明不考虑if语句。另外,异步编程博客URL中提到了异常部分,为了更清晰,我在回答中复制了它。您有一个关于特定程序的功能的问题。这些问题可以通过运行程序并观察发生了什么来回答。您想知道wait
和使用Result
之间是否存在异常处理差异,因此请双向编写程序,引发异常,并查看程序是否执行两种不同的操作,然后您就会知道!您的代码分配给timeoutTask
,但从不将变量的值用于任何事情;这个选择的目的是什么?@FedericoCalvagna,与此设计不同,您可能应该考虑传递一个任务
——将lambda返回到ExecuteIOTask
,而不是返回一个已经运行的任务,并使用CancellationTokenSource
(支持超时)。