【发布时间】:2014-10-31 11:01:21
【问题描述】:
我需要异步二进制下载并使用 WebClient 类。下载是异步的,但有一些例外。 DNS 解析似乎是同步工作的。如果远程服务器没有响应,则应用程序因“...无法解决”超时而阻塞。有没有办法让它与某些属性完全异步,或者我必须使用 BackgroundWorker 并重新组织下载。
【问题讨论】:
标签: c# asynchronous dns
我需要异步二进制下载并使用 WebClient 类。下载是异步的,但有一些例外。 DNS 解析似乎是同步工作的。如果远程服务器没有响应,则应用程序因“...无法解决”超时而阻塞。有没有办法让它与某些属性完全异步,或者我必须使用 BackgroundWorker 并重新组织下载。
【问题讨论】:
标签: c# asynchronous dns
有关可以异步执行的 DNS 解析服务,请参阅 System.Net.Dns。
您可以使用Dns.GetHostAddressesAsync() 或Dns.GetHostEntryAsync() 方法分别异步查找给定主机名、IP 地址或主机条目信息。然后,您可以使用生成的 IP 地址信息直接为您的 WebClient 操作指定远程主机,绕过其 DNS 解析延迟。
您在评论中声明您正在执行以下操作:
WebClient wc = new WebClient();
wc.Proxy = null;
wc.DownloadDataCompleted +=
new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
wc.DownloadDataAsync(new Uri("http://www.undefined-domain.com"));
我建议您在使用 await 进行 DNS 查找的同时,也将其用于下载:
WebClient wc = new WebClient();
byte[] result = await wc.DownloadDataTaskAsync("http://" + ipAddress.ToString());
(您可能不得不将 IP 地址从 DNS 结果格式化为适合WebClient 的格式)
如果您需要比这更具体的建议,我建议您修复您的问题,使其更清晰,并且(非常重要)包含一个很好的代码示例,准确显示您现在正在做什么并解释您希望它如何不同。
【讨论】: