C#在flakey网络上的强大的网络连接处理

时间:2011-05-04 01:37:35

标签: c# download stream

我有很多代码片段正确地从互联网上下载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.
}

1 个答案:

答案 0 :(得分:0)

我建议调查现有的解决方案。我的前两个想法是使用BITS或shell Robocopy。在可能不稳定的网络中下载文件时,两者都经过了很好的审查(BITS是Windows Update用来将更新下载到您的计算机上的。)