我有很多代码片段正确地从互联网上下载x / html页面和文件,而且它们 - 在大多数情况下 - 工作得很好。
不幸的是,我的家庭互联网连接在午夜到早上6点之间几乎无法使用。我得到了很多丢包和连接停滞。同样,我在工作时有一个备用3G连接,根据网络负载有间歇性中断。
当然我可以将下载代码放入try / catch中 - 但理想情况下我希望正确下载该文件,无论需要多长时间。
我已经尝试了很多方法来解决这个问题,并取得了不同程度的成功。
我已经尝试获取正在捕获的流的长度,并验证我的本地副本的长度是否相同。出于某种原因,(正确下载的)本地副本似乎总是比报告的流长度短几十个字节,但实际的短数似乎变化了。此外,并非所有流都具有可用长度。
我也尝试将我的try / catch'd段放在for循环中 - 让它尝试下载,比如50次。成功的下载会中断,而失败的下载会再次尝试。
我通过逐渐增加的延迟来增加上述内容 - 我有一个Thread.Sleep(),它会在每次迭代中逐渐睡眠更长更长时间。再次尝试。
我认为这个任务并不像听起来那么简单,因为很多我的个人软件 - Steam,Chrome,Windows Update,iTunes等......似乎根本无法处理我的连接。我经常不得不尝试下载大文件10-15次才能成功下载。这些开发人员都不关心处理连接问题,或者很难做到。
如果有可能,有人可以提供一个代码片段,它会从互联网上获取一个流,但会处理一个片状连接吗?
我想它应该是这样的:
public static MemoryStream Fetch(string url, int? maxRetries, int? maxDuration)
{
// Download the response of the url to a MemoryStream.
// Assume if null maxRetries and maxDuration, keep trying forever.
}