4

使用修改后的 WebClient,我定期从具有以下特征的服务下载数据:

  • 数据下载 (~1GB) 大约需要 20 分钟
  • 有时服务决定根本不返回任何数据(请求挂起),或者需要几分钟到几小时才能返回第一个字节。

如果服务在合理(可配置)的时间内没有返回任何数据,我想快速失败,但要留出足够的时间让正在取得进展的下载成功。

似乎WebRequest.Timeout属性控制请求完成的总时间,而ReadWriteTimeout控制数据传输开始后可用于读取数据的总时间。

我是否缺少一个属性来控制在建立连接和返回第一个字节之间等待的最长时间?如果没有这样的属性,我该如何解决这个问题?

4

1 回答 1

2

我不知道有任何额外的超时属性可以实现您正在寻找的结果。想到的第一个想法是附加一个处理程序DownloadProgressChanged,它将更新一个标志以指示已收到数据(但并不总是准确)。

使用TimerorEventWaitHandle然后您可以在短时间内阻塞(或处理异步,如果您愿意)并评估是否已收到任何数据。下面的代码不是一个完整的例子,而是一个关于如何实现它的想法。

using (var manualResetEvent = new ManualResetEvent(false))
using (var client = new WebClient())
{
    client.DownloadProgressChanged += (sender, e) => manualResetEvent.Set();
    client.DownloadDataAsync(new Uri("https://github.com/downloads/cbaxter/Harvester/Harvester.msi"));

    if (!manualResetEvent.WaitOne(5000))
        client.CancelAsync();
}

在上面的示例中,如果被调用,manualResetEvent.WaitOne则将返回。您可能想要检查并仅设置非零值,但我认为您明白了吗?trueDownloadProgressChangede.BytesReceived > 0

于 2012-06-20T14:46:47.643 回答