Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务完成后,什么更好:等待还是结果_C#_Async Await_Task - Fatal编程技术网

C# 任务完成后,什么更好:等待还是结果

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

我正在为我的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();
    }
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
(支持超时)。