异步超时 - 错误处理逻辑

时间:2015-09-24 14:07:45

标签: c# .net asynchronous

我试图了解两种情况之间代码行为的差异:

  1. if(t!= await Task.WhenAny(t,Task.Delay(500)))
  2. if(t!= Task.WhenAny(t,Task.Delay(150)) .Result
  3. 我理解第二个会因为我们立即等待其中一个而变慢。

    整个功能:

    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抛出未观察到的未观察到的异常: System.Net.WebException:请求已中止:请求已取消。

    虽然案例1只会抛出超时&#39;例外但从未如此?

    我在等待函数之外的任务: try {task.Wait()} catch {log exception}

    谢谢, 詹姆斯

1 个答案:

答案 0 :(得分:0)

差异似乎是由后台任务的处理方式引起的。 当我在两个请求完成后开始强制GC运行时,两种情况都抛出了未观察到的异常。