C# 多线程下载
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Threading; using System.Net; using System.IO; namespace WebAppTest { public partial class download : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //断点下载大文件 //原理:使用多个线程将一个文件分成多个文件进行下载 MutilDownload(); } public void MutilDownload() { int threadcount = 3; int threadCompleteNum = 0; string[] files = new string[threadcount]; int total = (int)GetDownloadFileSize(); int per = total / threadcount; for (int i = 1; i <= threadcount; i++) { int from = (i - 1) * per+1; int to = i * per; if (i == 1) { from = 0; } if (i == threadcount) { to = total; } string path = Server.MapPath("~/resource/video/"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } int index = i; Thread thread = new Thread(() => { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://192.168.1.100:106/test/test.avi"); request.Method = "get"; request.AddRange(from, to); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string filename = path + index + ".avi"; files[index-1] = filename; using (FileStream fs = new FileStream(filename, FileMode.CreateNew)) { byte[] buffer = new byte[5 * 1024 * 1024]; int r; using (Stream stream = response.GetResponseStream()) { while ((r = stream.Read(buffer, 0, buffer.Length)) != 0) { fs.Write(buffer, 0, r); } } } threadCompleteNum++; if (threadCompleteNum == threadcount) { //和并临时文件 string allFilename = path + "all.avi"; using (FileStream allFile = new FileStream(allFilename, FileMode.CreateNew)) { for (int j = 0; j < files.Length; j++) { using (FileStream tempFile = new FileStream(files[j], FileMode.Open)) { byte[] tempBuffer = new byte[5 * 1024 * 1024]; int t; while ((t = tempFile.Read(tempBuffer, 0, tempBuffer.Length)) != 0) { allFile.Write(tempBuffer, 0, t); } } } } //删除临时文件 foreach (var f in files) { if (File.Exists(f)) { File.Delete(f); } } } }); thread.IsBackground = true; thread.Start(); } } //获取下载文件大小 public long GetDownloadFileSize() { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://192.168.1.100:106/test/test.avi"); request.Method = "get"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); return response.ContentLength; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix