C# 使用WebClient快速失败
使用,我定期从具有以下特征的服务下载数据:C# 使用WebClient快速失败,c#,webclient,C#,Webclient,使用,我定期从具有以下特征的服务下载数据: 下载数据(~1GB)大约需要20分钟 有时服务决定根本不返回任何数据(请求挂起),或者需要几分钟到几小时才能返回第一个字节 如果服务在合理的(可配置的)时间内没有返回任何数据,但仍有足够的时间让正在进行的下载成功,我希望快速失败 属性while似乎控制数据传输开始后读取数据的总时间 我是否缺少一个属性来控制建立连接和返回第一个字节之间的最大等待时间?如果没有这样的属性,我如何处理这个问题?我不知道有任何额外的超时属性可以实现您所寻找的结果。首先想到
- 下载数据(~1GB)大约需要20分钟
- 有时服务决定根本不返回任何数据(请求挂起),或者需要几分钟到几小时才能返回第一个字节
我是否缺少一个属性来控制建立连接和返回第一个字节之间的最大等待时间?如果没有这样的属性,我如何处理这个问题?我不知道有任何额外的超时属性可以实现您所寻找的结果。首先想到的是将处理程序附加到
DownloadProgressChanged
,该处理程序将更新一个标志,以指示已收到数据(但并不总是准确的)
使用计时器
或EventWaitHandle
您可以在短时间内阻塞(或处理异步,如果您愿意)并评估是否已收到任何数据。下面的代码不是一个完全充实的示例,而是一个如何实现它的想法
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();
}
在上面的示例中,如果调用了
DownloadProgressChanged
,则manualResetEvent.WaitOne
将返回true
。您可能希望检查e.BytesReceived>0
并仅设置为非零值,但我想您明白了吗?我担心这将是确切的答案:-(