创建下载加速器

2024-03-11

我指的是本文 http://www.geekpedia.com/tutorial179_Creating-a-download-manager-in-Csharp.html了解使用 C# 下载文件。

代码使用传统方法读取Stream就像

((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0

如何将要下载的文件分成多个段,以便并行下载各个段并将它们合并?

using (WebClient wcDownload = new WebClient())
{
    try
    {
        // Create a request to the file we are downloading
        webRequest = (HttpWebRequest)WebRequest.Create(txtUrl.Text);
        // Set default authentication for retrieving the file
        webRequest.Credentials = CredentialCache.DefaultCredentials;
        // Retrieve the response from the server
        webResponse = (HttpWebResponse)webRequest.GetResponse();
        // Ask the server for the file size and store it
        Int64 fileSize = webResponse.ContentLength;

        // Open the URL for download 
        strResponse = wcDownload.OpenRead(txtUrl.Text);
        // Create a new file stream where we will be saving the data (local drive)
        strLocal = new FileStream(txtPath.Text, FileMode.Create, FileAccess.Write, FileShare.None);

        // It will store the current number of bytes we retrieved from the server
        int bytesSize = 0;
        // A buffer for storing and writing the data retrieved from the server
        byte[] downBuffer = new byte[2048];

        // Loop through the buffer until the buffer is empty
        while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
        {
            // Write the data from the buffer to the local hard drive
            strLocal.Write(downBuffer, 0, bytesSize);
            // Invoke the method that updates the form's label and progress bar
            this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize });
        }
    }

你需要几个线程来完成这个任务。 首先,您启动第一个下载线程,创建一个网络客户端并获取文件大小。然后您可以启动几个新线程,其中添加下载范围标头。 您需要一种逻辑来处理下载的部分,并在完成后创建新的下载部分。

http://msdn.microsoft.com/de-de/library/system.net.httpwebrequest.addrange.aspx http://msdn.microsoft.com/de-de/library/system.net.httpwebrequest.addrange.aspx

我注意到 WebClient 实现有时会出现奇怪的行为,因此如果您确实想编写一个“大”下载程序,我仍然建议您实现自己的 HTTP 客户端。

ps:感谢用户svick

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建下载加速器 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 无法从程序集“mscorlib”加载类型“System.Security.Principal.WindowsImpersonationContext”

    我正在创建一个 ASP NET API Core 应用程序来处理与 Oracle 数据库通信的 API 服务 在运行时 当进程尝试通过 DbContext 实体框架 使用新的 Oracle 连接连接到数据库时 会出现未处理的错误并强制应用程
  • SQL 数据读取器 - 处理空列值

    我正在使用 SQLdatareader 从数据库构建 POCO 除非在数据库中遇到空值 否则该代码将正常工作 例如 如果数据库中的 FirstName 列包含空值 则会引发异常 employee FirstName sqlreader Ge
  • 部署网站时缺少 using 指令或程序集引用错误

    我有一个网站 其中 cs 文件位于 App Code 文件夹中 在我的项目中添加类项时 VS2010 建议我创建此文件夹 我有一个使用此类的 default aspx cs 文件 我在VS2010上运行没有任何错误 但是 当我通过私人托管公
  • 找到重复元素异或运算符数组中的两个非重复元素?

    假设我有一个包含 2n 2 个元素的数组 数组中的 n 个元素出现了两次 其余两个元素是唯一的 你必须在 O n 时间和 O 1 空间内解决这个问题 解决方案之一是使用 XOR 但我无法理解这一点 任何人都可以帮助我解决这个问题或者可以给我
  • 更改声音文件的速度

    我正在寻找改变声音文件的速度 但不知道如何实现它 我假设在减慢速度的情况下必须进行某种类型的插值 但不确定如何实现加速 也许是几个样本的平均值 无论是改变节奏还是音调 目前并不重要 我想学习如何实现这两者 但至少想先完成其中一个 如果有人对
  • 如何更改32位寄存器的特定位而不更改其他位?

    我想直接使用寄存器的物理地址来操作寄存器的某些位 但是我找不到方法来做到这一点 我看到一些关于设置位掩码的帖子 但我发现它们太令人困惑了 我的寄存器物理地址是 0x4A10005C 我想操纵它的 18 16 位之间的位 我想设置0x3在那些
  • 这个模板语法“typename = T”是什么意思?

    有时我会看到这样的语法 template
  • 如何使用 PAC(代理自动配置)通过 Fiddler 调试 Htmlunit 流量

    我有一个使用 Htmlunit 的应用程序 需要放置 Fiddler 来拦截流量 我读了一些有关通过附带的 PAC 代理自动配置 javascript 文件配置它的内容 但我无法再次找到该文章 如何通过 PAC 配置 Htmlunit PA
  • 为什么声明字符串时不需要分配内存[重复]

    这个问题在这里已经有答案了 我是 C 新手 目前我正在尝试了解指针是如何工作的 这是一个让我困惑的问题 据我所知 在给指针赋值之前 应该为该指针分配一定的内存 如果我错了 请纠正我 如下面的代码 int main void int i in
  • 从 Haskell 列表中删除重复元素

    我是 Haskell 的初学者 我只是想知道如何实现一个函数来从数组中删除重复元素 例如 1 1 1 3 4 2 2 3 结果应为 1 3 4 2 我不想使用一些现有的函数 例如 element 并通过使用递归来实现它 我的想法是比较 x
  • 调暗屏幕的正确方法是什么?

    到目前为止 我在搜索中看到了两种方法 这两种方法我都遇到了麻烦 方法一 Settings System putInt getContentResolver Settings System SCREEN BRIGHTNESS 100 方法2
  • 我应该使用 ASP.NET 会话还是避免使用它们,为什么?

    我应该使用 ASP NET 会话还是避免使用它们 为什么 对于新的应用程序 我试着避开他们 https stackoverflow com questions 526697 upgrade from net 3 0 to 3 5 sites
  • DirectX 与 VB.NET

    是否有一组有关 DirectX 9 或更高版本 的文档 其中显示了将 DirectX 9 或更高版本 与 VB NET 一起使用的对象 方法 属性 事件和示例代码 最新的 SDK 包含 C 的详细信息 而 Windows DiectX 图形
  • 无需任何代码即可在 xml 文件中定义 Tabhost/TabWidget + 内容 - 这可能吗?

    是否可以仅在布局 xml 文件中定义选项卡布局 每次我找到 tabhost 教程时 它都只能与一些额外的 java 代码一起使用 这是我的 test xml 它不显示任何选项卡
  • 创建一个可变的 java.lang.String

    众所周知 JavaStrings 是不可变的 自 java 诞生以来 不可变字符串就是它的一个重要补充 不变性允许快速访问和大量优化 与 C 样式字符串相比 显着减少出错的可能性 并有助于实施安全模型 可以在不使用 hack 的情况下创建一
  • sqlalchemy 唯一约束 VS 索引(unique=True)

    我正在使用 MySQL 运行 InnoDB 并使用 sqlalchemy 包装整个内容 现在 我想使用 请参阅docs http sqlalchemy utils readthedocs io en latest database help
  • 将分层 xml 绑定到树视图

    我有一个标准的 NET 3 5 winforms 项目 在它上面 它有一个树视图 我已使用 XmlSerializer 和相关类将 List 实例序列化为 XML 以获得分层 XML 文件 现在 我需要将此 XML 文件绑定到树视图以显示其
  • 使用两个掩码更新数组值 a[mask1][mask2]=value

    给定一个数组和一个掩码 我们可以将新值分配给掩码中为 TRUE 的位置 import numpy as np a np array 1 2 3 4 5 6 mask1 a 2 a 5 a mask1 100 print a 1 100 3
  • 模拟器可以播放什么格式的视频?

    Android模拟器支持哪些格式的视频文件 我知道它可能不会实时播放 但是哪些会实时播放 秘密在于模拟器将播放 MP4 基线配置文件 而真实设备也将播放更好的 MP4 配置文件 为了获得在模拟器中正常播放的视频文件 请尝试以下设置 ffmp
  • 创建下载加速器

    我指的是本文 http www geekpedia com tutorial179 Creating a download manager in Csharp html了解使用 C 下载文件 代码使用传统方法读取Stream就像 bytes