【问题标题】:Downloading files using download manager in C#在 C# 中使用下载管理器下载文件
【发布时间】:2013-08-27 09:01:36
【问题描述】:

我正在用 C# 创建下载管理器。我目前正在设计给定 URL 的下载组件,从 URL 分段下载文件。

我目前正在为每个块使用 I/O 流,如下所示:

    MyChunks.InputStream = rs ; 
//rs is obtained by using GetResponse() from FtpWebRequest or HttpWebRequest
    MyChunks.OutputStream = fs ; //fs is FileStream for writing on local file
    chunksize = MyChunks.InputStream.Read(buffer, 0, bufferSize);
    MyChunks.OutputStream.Write(buffer, 0, (int)chunksize);

关于我分析的其他方法,我发现我也可以使用 `WebClient.DownloadDataAsync` 方法。
但是,我不能利用在多个线程上下载的数据块来加速下载。此外,以上代码工作正常。


我的问题是:

  1. 有没有其他方法可以下载块或以上 代码就好了?

  2. 另外,我想在下载音频 (mp3)/视频文件时播放它们 你能建议做同样的方法吗?

【问题讨论】:

    标签: c# .net download download-manager


    【解决方案1】:

    使用发布的代码,您只下载文件的一部分,这是正确的。根据缓冲区的大小,整个下载内容不太可能适合缓冲区。因此,您必须从上面重复代码片段,直到到达流的末尾。这就是从缓冲流中读取的工作原理。

    但是通过分块下载文件,通常认为文件被分成多个部分,然后这些部分分别下载。

    要实现这一点,您必须使用 HTTP Range 标头(有关讨论,请参阅 this question),它允许您仅下载一部分数据并使用多个客户端。

    但是即使您使用多个线程同时下载块也不会加快下载速度,因为您的bandwidth 限制了下载速度。相反,您必须管理块偏移和冗余连接。

    上面提到的方法DownloadDataAsync是用来非阻塞下载数据的,大家可以看this question讨论。

    现在到问题的第二部分:虽然在某些情况下可以在播放过程中分块下载文件,但这种方法在连接速度较慢时会失败。您是否考虑过寻找streaming solution

    最后,this question 指向NAudio,它甚至还附带了一个Mp3StreamingDemo,允许播放流式 mp3 音频文件。

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多