首页 > 代码库 > C# 多线程下载
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; } }}
C# 多线程下载
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。