使用WebClient快速失败
使用修改后的WebClient ,我定期从具有以下特征的服务下载数据:
- 数据下载(~1GB)大约需要20分钟
- 有时服务决定不返回任何数据(请求挂起),或者返回第一个字节需要几分钟到几小时。
如果服务在合理(可配置)的时间内没有返回任何数据,我希望快速失败,同时允许有足够的时间进行下载,以便取得成功。
似乎WebRequest.Timeout属性控制请求完成的总时间,而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
并且只设置非零值,但我想你明白了吗?
- 查找所有父类型(基类和接口)
- 如何在Windows Phone 8.1中使用ShareLinkTask命名空间?
- 当一个属性隐藏带有’new’关键字的inheritance成员时,reflection如何告诉我?
- entity framework是否具有来自Linq2Sql(ObjectContext.CreateQuery ?)的等效DataContext.GetTable
- 如果不是双击,如何处理WinForms控件单击事件
- 如何在C#中覆盖默认值(T)?
- 在Form Load之前,数据绑定不起作用 – 仅在Form加载后初始化ComboBox项
- Moq和Interop类型:在VS2012中工作,在VS2010中失败?
- 带文本和值的C#ComboBox