C# | 多线程批量下载文件(创建N个线程同时批量下载文件,只需要几行代码而已)

简介: 批量下载文件时使用多线程可以有效缩短完成时间,本文将讲解如何使用C#+CodePlus扩展库快速完成多线程的文件下载。大部分代码由IDE自动生成,需要我们自己编写的代码正好**10行**。也就是说,只需要10分钟,就可以手撸一个多线程的批量下载器。

image.png

C# 创建N个线程同时批量下载文件

@[toc]

前言

批量下载文件时使用多线程可以有效缩短完成时间,本文将讲解如何使用C#+CodePlus扩展库快速完成多线程的文件下载。

演示视频

https://live.csdn.net/v/embed/248565


源码

大部分代码由IDE自动生成,需要我们自己编写的代码正好10行。也就是说,只需要10分钟,就可以手撸一个多线程的批量下载器。

image.png

using STTech.CodePlus.Threading;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Windows.Forms;

namespace Test.MTDownloader.Desktop
{
   
   
    public partial class MainForm : Form
    {
   
   
        public MainForm()
        {
   
   
            InitializeComponent();
        }

        private void btnDownload_Click(object sender, EventArgs e)
        {
   
   
            // 创建下载目录(如果不存在)
            Directory.CreateDirectory(tbSavePath.Text);

            // 获取所有下载链接
            var urlArray = tbUrl.Lines;

            // 从界面控件获取线程数
            var threadCount = (int)mudThreadCount.Value;

            // 将所有下载链接按照线程数均分成多组链接
            var downloadGroup = urlArray.Balance(threadCount);

            // 使用多线程执行下载任务
            TaskExtension.Run(downloadGroup, threadCount, DownloadHandler);

            // 提示下载完成
            MessageBox.Show("OK.");
        }

        /// <summary>
        /// 每个组的链接下载处理过程
        /// </summary>
        /// <param name="urlGroup"></param>
        private void DownloadHandler(IEnumerable<string> urlGroup)
        {
   
   
            // 创建WebClient
            WebClient client = new WebClient();

            // 遍历Url
            foreach(string url in urlGroup)
            {
   
   
                // 从链接中获取文件名
                var fileName = Path.GetFileName(url);

                // 下载文件到指定目录
                client.DownloadFile(url, Path.Combine(tbSavePath.Text, fileName));
            }
        }
    }
}

依赖库

如此简单完成多线程相关的开发是因为引用的CodePlus提供的扩展方法。
对着项目右键,选择管理NuGet程序包

image.png

在搜索栏中输入CodePlus,选择图中的程序包后,选择最新版本安装即可。

image.png

相关文章
|
3月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
174 2
|
2天前
|
C#
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
|
8天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
27 3
|
2月前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
39 6
|
3月前
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
Lua的面向对象编程、协同线程与协同函数的概念和使用,以及Lua文件I/O操作的基本方法。
40 4
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
|
3月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
52 1
|
3月前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
105 2
|
3月前
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
46 0
|
3月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
119 0
|
4月前
|
安全 算法 Java
多线程写入同一个文件时,如何保证写入正常
【9月更文挑战第3天】多线程写入同一个文件时,如何保证写入正常
648 8