c#在flakey网络上健壮的网络连接处理



我有相当多的代码片段可以正确地从互联网上下载x/html页面和文件,并且它们-在大多数情况下-工作得很好。

不幸的是,我家的互联网连接在午夜到早上6点之间几乎无法使用。我有很多丢包和连接中断。同样,我在工作中有一个备用3G连接,根据网络负载的不同,它会间歇性中断。

当然,我可以将下载代码放入try/catch中-但理想情况下,我希望文件能够正确下载,无论需要多长时间。

为了解决这个问题,我尝试了很多方法,成败参半。

我已经尝试获取我正在捕获的流的长度,并验证我的本地副本是相同的长度。由于某些原因,(正确下载的)本地副本似乎总是比报告的流长度短几十个字节,但实际的短数似乎有所不同。而且,并不是所有的流都有这个长度。

我还尝试将try/catch片段放入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.
}

我建议您研究一下现有的解决方案。我的头两个想法是要么使用BITS,要么购买Robocopy。两者都可以很好地在可能不稳定的网络中下载文件(BITS是Windows Update用来下载更新到您的机器的)。

相关内容

  • 没有找到相关文章

最新更新