CSkin博客

标题: 【批量下载】c# 多线程多文件批量下载 [打印本页]

作者: 王龙    时间: 2017-7-8 17:51
标题: 【批量下载】c# 多线程多文件批量下载
说明:
开发过程中其实总是会碰到项目想应用下载文件~
看其他语言有很多封装好的类库可以使用~~
作为小白的我并没有找到很多c#的案例可参考
后找到一款“MutThreadDownLoadFile”的demo
但是每次使用感觉并不方便,另外可用信息可扩展不是特别强。。
然后重新改进并封装了类库的形式,可以简单使用

效果截图:



贴出此demo的代码看一下:
[C#] 纯文本查看 复制代码
        DownLoadFile dlf = new DownLoadFile();
        private void btnTest_Click(object sender, EventArgs e)
        {
            string[] lines = File.ReadAllLines("华军软件.txt");
            for (int i = 0; i < lines.Length; i++)
            {
                string[] line = lines.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                if (line.Length == 2)
                {
                    string path = Uri.EscapeUriString(line[1]);
                    string filename = Path.GetFileName(path);
                    string dir = @"D:        est";
                    ListViewItem item = listView1.Items.Add(new ListViewItem(new string[] { (listView1.Items.Count + 1).ToString(), filename, "0", "0", "0%", "0", "0", DateTime.Now.ToString(), "等待中", line[1] }));
                    int id = item.Index;
                    dlf.AddDown(path, dir, "", id);
                }
            }
            dlf.StartDown();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dlf.ThreadNum = 3;//线程数,不设置默认为3
            dlf.doSendMsg += SendMsgHander;//下载过程处理事件
        }
        private void SendMsgHander(DownMsg msg)
        {
            switch (msg.Tag)
            {
                case DownStatus.Start:
                    this.Invoke((MethodInvoker)delegate ()
                    {
                        listView1.Items[msg.Id].SubItems[8].Text = "开始下载";
                        listView1.Items[msg.Id].SubItems[7].Text = DateTime.Now.ToString();
                    });
                    break;
                case DownStatus.GetLength:
                    this.Invoke((MethodInvoker)delegate ()
                    {
                        listView1.Items[msg.Id].SubItems[3].Text = msg.LengthInfo;
                        listView1.Items[msg.Id].SubItems[8].Text = "连接成功";
                    });
                    break;
                case DownStatus.End:
                case DownStatus.DownLoad:
                    this.Invoke(new MethodInvoker(() =>
                    {
                        this.Invoke((MethodInvoker)delegate ()
                        {
                            listView1.Items[msg.Id].SubItems[2].Text = msg.SizeInfo;
                            listView1.Items[msg.Id].SubItems[4].Text = msg.Progress.ToString() + "%";
                            listView1.Items[msg.Id].SubItems[5].Text = msg.SpeedInfo;
                            listView1.Items[msg.Id].SubItems[6].Text = msg.SurplusInfo;
                            if (msg.Tag == DownStatus.DownLoad)
                            {
                                listView1.Items[msg.Id].SubItems[8].Text = "下载中";
                            }
                            else
                            {
                                listView1.Items[msg.Id].SubItems[8].Text = "下载完成";
                            }
                            Application.DoEvents();
                        });
                    }));
                    break;
                case DownStatus.Error:
                    this.Invoke((MethodInvoker)delegate ()
                    {
                        listView1.Items[msg.Id].SubItems[6].Text = "失败";
                        listView1.Items[msg.Id].SubItems[8].Text = msg.ErrMessage;
                        Application.DoEvents();
                    });
                    break;
            }
        }


应用时不考虑下载过程
只需要添加下载的文件
设定好下载线程以及最多每次下载几个文件(默认为3)即可

希望这次的封装,可以帮到其他需要应用到该类库的朋友

由于时间的关系,只是花了两天的时间测试和完善,可能很多地方考虑的并不是很周全(暂时没发现太明显bug)
大家可以应用并测试后反馈在这个地方,方便我们一起更好的完善它!

下载地址:
DownLoadFile.zip (106.34 KB, 下载次数: 768)
同步发布在博客园:c# 多线程多文件批量下载 - 野生程序员 - 博客园


作者: Even    时间: 2017-7-11 17:03
還不錯~看看哦~
作者: root111    时间: 2017-7-12 16:40
大爱楼主无私共享
作者: 一生繁华    时间: 2017-7-15 10:00
大爱楼主无私共享
作者: NEKO    时间: 2017-10-30 22:46
good ~ 研究一下
作者: jkevIn    时间: 2017-11-1 17:19
学习一下。。。。。
作者: hp874a6    时间: 2017-11-21 22:14
这个学习一下,比较好的
作者: QW去    时间: 2018-1-9 12:52
感谢楼主分享
作者: zpchlover    时间: 2018-7-28 13:33
感谢分享!!
作者: alexhan    时间: 2018-11-6 13:53
很差不错的东西 支持支持!
作者: gzAndy    时间: 2018-11-9 09:38
下来学习学习
作者: 快乐程序    时间: 2021-5-11 16:34
下载学习,感谢分享
作者: QW去    时间: 2022-2-22 14:50
不错




欢迎光临 CSkin博客 (http://bbs.cskin.net/) Powered by Discuz! X3.2