设置超时时HttpClient挂起(Windows Phone)

Mik*_*nev 6 c# async-await dotnet-httpclient windows-phone-8

我正在尝试HttpClient在Windows Phone App中设置超时对象.但是如果请求在超时之前没有完成,则GetAsync永远不会返回值.

我正在使用以下代码来获得响应:

HttpClientHandler handler = new HttpClientHandler();
HttpClient client = new HttpClient(handler);
client.Timeout = TimeSpan.FromSeconds(5);
client.BaseAddress = new Uri("http://www.foo.com");
HttpResponseMessage response = await client.GetAsync("/boo.mp3");//<--Hangs
byte[] data = await response.Content.ReadAsByteArrayAsync();
Run Code Online (Sandbox Code Playgroud)

如何正确设置超时以从GetAsync获取结果?

Geo*_*des 9

取自HttpClient文档:

默认值为100,000毫秒(100秒).

域名系统(DNS)查询最多可能需要15秒才能返回或超时.如果您的请求包含需要解析的主机名,并且您将Timeout设置为小于15秒的值,则在抛出WebException之前可能需要15秒或更长时间才能指示请求超时.

并且正如ZombieSheep所说,即使DNS查询完成,5秒也不够.

我建议删除超时并让它为默认值,因为从我所知道的"检查"任务没有停止的唯一方法是假设如果你ping服务器并且它回复连接仍然是"好的" "并且正在处理/下载您的文件.


Zom*_*eep 2

无需编写代码进行检查,以下是一些可能的罪魁祸首。

1) 您的 5 秒超时时间不足以下载完整文件“boo.mp3”,因此超时会停止操作。
2) 您的网络服务器响应时间太长(不太可能,但可能通过移动网络)

最好完全删除超时值,或者将其设置为更实际的值。