2015-09-24 103 views
-1

我想了解这两种情况之间的代码行为差异:异步超时 - 错误处理逻辑

  1. 如果(T = 等待 Task.WhenAny(T,Task.Delay( 500)))
  2. 如果(T!= Task.WhenAny(T,Task.Delay(150))。结果

据我所知,第二个将是因为我们等待较慢一个或另一个立即。

的整体功能:

public async Task<string> TestAsyncTimeout() 
     { 
      var test =WebRequest.Create("https://10.11.12.13"); 
      var t = test.GetResponseAsync(); 

      //if (t != await Task.WhenAny(t, Task.Delay(500))) 
      if (t != Task.WhenAny(t, Task.Delay(150)).Result) 
      { 
       Console.WriteLine("Timed out"); 
       test.Abort(); 
       Console.WriteLine("Request aborted"); 
       throw new Exception("Timed out"); 
      } 

      return (await t).ContentLength.ToString(); 
     } 

此函数调用不存在的IP,总是超时。

为什么情况2)从TaskScheduler中抛出未观察到的Unobserved异常: System.Net.WebException:请求被中止:请求被取消。

虽然案例1只会引发“超时”异常,但从未如此?

我等待任务的功能外: 尝试{task.Wait()} {捕获日志异常}

谢谢, 詹姆斯

回答

0

的差异似乎是由如何引起的后台任务被处理。 当我在两个请求完成后开始强制GC运行时,在两种情况下都抛出了Unobserved异常。