2015-09-24 118 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異常。