C# FileDownloader / 多线程断点续传

在本文中主要开源一款由本人编写的“多线程文件下载工具” 在最初编写“HttpFileDownloader”
时,并不考虑支持关闭软件后 在打开支持“文件断点续传” 最初考虑是“多线程下载”
所以对“文件断点续传”的支持是后期套上去的 造成代码可读性变差不少 不过并不影响功能
当前代码运行对内存要求低廉 但如果你从互联网下载很庞大的文件 那么对“中央处理器”的
性能越发高 同时需要注意在1.5G文件可能造成“模板空间溢出”故而停止下载 解决这个问题
办法需通过“底层文件API操作”
C# FileDownloader / 多线程断点续传_第1张图片
如果你想尽量降低对“处理器性能消耗”那么修改“每次读取脉冲缓冲区尺寸”、会是个不错的
方案 但是对“CPU性能消耗的降低微乎其微” 最好的办法是引入“迅雷旋风”的“分块缓存填充”
概念,这是我的对它称呼 别人是不是我不知道 因为它非常类似此类技术
以“旋风”为例 在内存中默认划分64MB本地内存填充区域 简单的说就是通过“消耗内存”换取
“执行性能”是具备可行公式的 当然它具备缺点 它并不是立刻写入到磁盘 如果发生断电或停
止响应 那么它必须重新下载被划分的部分 因为划分不全属于坏死 必须重新缓存
有时候可能会发现迅雷与旋风下载的压缩包文件是损坏的 但是通过浏览器下载却是没问题
的这是因为一旦文件过于巨大 由于各个文件下载工具在开发时对填充缓存处理不当造成的
即便开发者对工具代码设置多种检查 但还是不可避免的会出现一点问题 当然日常应用不会
感受到然而解决它最好的办法是直接写到磁盘 而不是填充缓存同步写入 但是又会绕道上面
的问题 似乎没有最佳解决方案
C# FileDownloader / 多线程断点续传_第2张图片
在上图中可以看到在“缓存速度”高达32.0MB 对于目前的“家用光纤”最高是“100Mbps”根本不
可能一秒钟32.0MB 本文标题提到“多线程断点续传” 假设这是因上次被恶意关闭工具后 重新
运行后开始下载时发生的 因为在“牽絆繁體最終版.bpi(BreakPoint Information)”文件中保留了
关于任务的信息再次开始下载时 遇到相同保存文件名 自动检查关联的BPI文件 继续上次未完
成的下载文件任务 只要理解了“多线程分段下载”那么“多线程断点续传”也等同于理解
或许你会发现与突然与迅雷旋风很相似有个配置文件 当然不一定非要文件只要可以保存数据
的地方就可以 注册表也行
C# FileDownloader / 多线程断点续传_第3张图片
在上方可以看到与“有情燕.mp4”相关联的“有情燕.bpi”中的内容 它是一个标准的XML配置文件
上面保存了一些信息 在设计该配置时 我认为不需要太多信息 只要几个必要的则可以
  1. 网络文件大小
  2. 网络文件主机
  3. 已读缓存尺寸
  4. 线程正文信息
在线程正文不需要过多信息 只需要两个关键性的信息即可
  1. 单个线程下载当前位置
  2. 全部线程的计数
所以在上方的“断点信息”中信息很少的原因 不过要太多信息也没太大作用 假设需要才可能加入
如果不需要往里面加则不合适 好了、在本文中只开源不废话 讨论“分段下载原理”改日令贴说明
示例代码:http://pan.baidu.com/s/1o7go5YU

HttpFileDownloader 公开成员注解:
// 读网络缓存通知
public event EventHandler ReadNetCacheNotify;
// 创建文件下载器(网络文件地址,本地存储位置)
public static HttpFileDownloader CreateFileDownloader(string strNetFileAddress, string strLocalStoreLocation);
// 开始网络文件下载
public void HttpFileDownloaderAsync();
// 读网络缓存进度
public int ReadNetCacheProgress { get; }
// 读网络缓存速度
public long ReadNetCacheSpeed { get; }
// 查询文件信息
public void QueryHttpFileInformation();
// 网络文件大小
public long NetFileLength { get; }
// 网络文件名
public string NetFileName { get; }
// 网络文件地址 / URL
public string NetFileAddress { get; }
// 网络主机名
public string NetFileHostName { get; }
// 本地存储位置
public string LocalStoreLocation { get; }
// 文件分块大小
public long FilePartBlockSize { get; }
// 已读缓存大小
public long HasReadCachedSize { get; }
// 网络线程正文集合
public HttpThreadContextCollection NetThreadContextCollecion { get; }

HttpThreadContextCollection 公开成员注解:
// 获取或设置网络线程正文数
public int Count { get; set; }
// 获取或设置线程重启时间(如果发生任何异常重启下载正文的时间)
public int RestartTime { get; set; } // if raise any error, restart breakpoint downloader.
// 挂起全部网络线程正文
public void SuspendContext();
// 恢复全部网络线程正文
public void ResumeContext();
// 终止全部网络线程正文
public void AbortContext();

示例参考:
C# FileDownloader / 多线程断点续传_第4张图片

你可能感兴趣的:(C#)