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; } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。