【问题标题】:WebClient DownloadDataAsync blockingWebClient DownloadDataAsync 阻塞
【发布时间】:2014-10-31 11:01:21
【问题描述】:

我需要异步二进制下载并使用 WebClient 类。下载是异步的,但有一些例外。 DNS 解析似乎是同步工作的。如果远程服务器没有响应,则应用程序因“...无法解决”超时而阻塞。有没有办法让它与某些属性完全异步,或者我必须使用 BackgroundWorker 并重新组织下载。

【问题讨论】:

    标签: c# asynchronous dns


    【解决方案1】:

    有关可以异步执行的 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 的格式)

    如果您需要比这更具体的建议,我建议您修复您的问题,使其更清晰,并且(非常重要)包含一个很好的代码示例,准确显示您现在正在做什么并解释您希望它如何不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 2021-11-12
      • 1970-01-01
      • 2011-09-01
      • 2020-10-13
      • 2012-02-20
      相关资源
      最近更新 更多