HttpWebRequest.GetResponse()与GetResponseAsync()中的超时行为

时间:2014-10-06 10:29:03

标签: c# httpwebrequest async-await

当我尝试以下代码时:

var request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Timeout = 3; // a small value

var response = request.GetResponse();
Console.WriteLine(response.ContentLength);

对于我知道加载时间超过3毫秒的网址(我在Thread.Sleep(110000)中添加了Application_BeginRequest)它可以正常工作并按预期抛出WebException

当我切换到异步方法时出现问题:

var response = request.GetResponseAsync().Result;

var response = await request.GetResponseAsync();

此异步版本完全忽略任何超时值,包括ReadWriteTimeoutServicePoint.MaxIdleTime

我无法在MSDN GetResponseAsync()中找到有关Timeout的任何内容,现在我想知道它是GetResponseAsync()中的错误还是我的方式出错了在这里使用异步?

2 个答案:

答案 0 :(得分:17)

Timeout不适用于异步HttpWebRequest请求。引用the docs

  

Timeout属性对异步请求没有影响

我建议您使用HttpClient代替,其设计考虑了异步请求。

答案 1 :(得分:0)

按照解决问题的方法进行解决。

    If sheetName <> "" Then
Workbooks.Open "C:\Users\jschu\Desktop\price test\Quote_Database.xlsx"
Workbooks("Quote_Database.xlsx").Sheets(sheetName).Select

Else
Workbooks.Open "C:\Users\jschu\Desktop\price test\Quote_Database.xlsx" ' Open Quote Database file

idNumber = Format(Now, "YYMMDDHHSS") ' Generate unique #
sheetName = idNumber & " " & UserForm3.nameText
    With Workbooks("Quote_Database.xlsx") ' Finds the last sheet then adds a new sheet with the idnumber and customer name
        .Sheets.Add(After:=.Sheets(.Sheets.count)).Name = sheetName
    End With
End If