加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用WebClient快速失败

发布时间:2020-12-15 17:27:02 所属栏目:百科 来源:网络整理
导读:使用 modified WebClient,我定期从具有以下特征的服务下载数据: 数据下载(~1GB)大约需要20分钟 有时服务决定不返回任何数据(请求挂起),或者返回第一个字节需要几分钟到几小时. 如果服务在合理(可配置)的时间内没有返回任何数据,我想快速失败,同时允许有足够
使用 modified WebClient,我定期从具有以下特征的服务下载数据:

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

如果服务在合理(可配置)的时间内没有返回任何数据,我想快速失败,同时允许有足够的时间进行下载,以便取得成功.

似乎WebRequest.Timeout属性controls the total time for the request to complete,而ReadWriteTimeout控制数据传输开始后可用于读取数据的总时间.

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

解决方法

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

使用Timer或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并且仅设置为非零值,但我认为你明白了吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读