• 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;
            }
        }
    }
  • 相关阅读:
    document.getElementById(), getElementsByname(),getElementsByClassName(),getElementsByTagName()方法表示什么以及其意义
    Go -10 Go Web 简单实现
    Go -09 Go 函数和方法区别
    Go -08 Go win 环境搭建
    Go-07 Go 规范代码风格
    Go-06 Go 语言注释(comment)
    Go-05 Go 转义字符
    Go-04 Go 语法要求和注意事项
    Go-03 Go 快速入门
    Go-02 搭建 Go 开发环境(mac系统)
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/4181140.html
Copyright © 2020-2023  润新知