C#:ThreadPool 实现高效多线程处理

news2024/12/30 2:56:17

请关注微信公众号:拾荒的小海螺
博客地址:http://lsk-ww.cn/

1、简述

在现代软件开发中,提升应用程序的并发能力和性能是一个重要的任务。C# 提供了多种实现并发的方式,其中,ThreadPool(线程池)是一个非常有用的工具。本文将介绍 ThreadPool 的基本概念、使用方法,并通过详细示例展示如何在实际应用中使用它。
在这里插入图片描述

2、什么是 ThreadPool?

ThreadPool 是一个管理线程的池,线程池中的线程可以被重复使用,用于执行多个任务。使用线程池可以减少创建和销毁线程的开销,提高应用程序的性能。线程池会自动管理线程的生命周期,优化资源的使用。

2.1 优势
  • 性能提升:减少线程创建和销毁的开销。
  • 资源管理:线程池自动管理线程,避免了手动管理线程资源的复杂性。
  • 简化代码:通过简单的 API 调用,可以实现复杂的并发任务处理。
2.2 在什么情况下使用线程池?
  • 单个任务处理的时间比较短
  • 需要处理的任务的数量大

设置ThreadPool最大和最小线程数:

ThreadPool.SetMaxThreads(5, 5);
ThreadPool.SetMinThreads(1, 1);
2.3 使用 ThreadPool

使用 ThreadPool 非常简单。通过 ThreadPool.QueueUserWorkItem 方法可以将一个任务排队到线程池中等待执行。以下是一个基本示例:

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Console.WriteLine("主线程开始");

        // 将任务排队到线程池中
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), "任务1");
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), "任务2");

        Console.WriteLine("主线程结束");
        
        // 让主线程等待一段时间以便观察线程池中的任务执行情况
        Thread.Sleep(3000);
    }

    static void DoWork(object state)
    {
        string taskName = (string)state;
        Console.WriteLine($"{taskName} 开始");

        // 模拟一个工作
        Thread.Sleep(1000);

        Console.WriteLine($"{taskName} 结束");
    }
}

在这个示例中,我们创建了两个任务并将它们排队到线程池中。主线程继续执行,并在末尾等待一段时间以便观察线程池中的任务执行情况。

3、样例

下面是一个更复杂的示例,展示了如何使用线程池处理大量任务,并在任务完成后进行一些合并操作。

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Console.WriteLine("主线程开始");

        int taskCount = 10;
        CountdownEvent countdown = new CountdownEvent(taskCount);

        for (int i = 0; i < taskCount; i++)
        {
            ThreadPool.QueueUserWorkItem(state =>
            {
                int taskId = (int)state;
                DoWork(taskId);
                countdown.Signal();
            }, i);
        }

        // 等待所有任务完成
        countdown.Wait();

        Console.WriteLine("所有任务完成");
        Console.WriteLine("主线程结束");
    }

    static void DoWork(int taskId)
    {
        Console.WriteLine($"任务 {taskId} 开始");

        // 模拟一个工作
        Thread.Sleep(new Random().Next(500, 2000));

        Console.WriteLine($"任务 {taskId} 结束");
    }
}

在这个示例中,我们使用 CountdownEvent 来等待所有任务完成。CountdownEvent 是一个线程同步的辅助类,初始化时设置计数器的初始值,每次调用 Signal 方法会将计数器减一,当计数器为零时,Wait 方法会被唤醒,从而确保所有任务都已经完成。

4、总结

C# 的 ThreadPool 提供了一个高效、简单的多线程处理方式,可以显著提升应用程序的并发能力和性能。通过 ThreadPool,可以轻松地管理线程资源,避免手动管理线程的复杂性。在实际应用中,ThreadPool 非常适合用于执行大量短时间的小任务,例如处理网络请求、文件 I/O 操作等。

希望本文对你理解和使用 C# 的 ThreadPool 有所帮助。如果有任何问题或建议,欢迎在评论区交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊新店如何实现高效流量转化?自养号测评深度解析与实用策略

在亚马逊平台上&#xff0c;自养号测评是一种通过卖家自行控制的海外买家账号对商品进行评价的方法&#xff0c;旨在提高商品的排名和流量。 亚马逊的自养号测评是指卖家通过使用在海外真实环境注册的买家账号&#xff0c;代替真实买家对商品进行测评。账号由卖家自己管理&…

Python对象复制竟然有这么多种方式,赶紧学起来!

目录 1、浅拷贝:copy模块的copy()函数 📋 1.1 浅拷贝原理揭秘 1.2 实战演示:列表与字典的浅拷贝 列表浅拷贝示例 字典浅拷贝示例 1.3 注意事项:共享引用与独立对象 2、深拷贝:copy模块的deepcopy()函数 📌 2.1 深拷贝实现机制解析 2.2 深拷贝优势分析 2.3 深度…

SRM供应商管理系统建设方案及源码实现(方案+源码)

1. 供应商管理 2. 采购需求管理 3. 采购寻源管理 4. 采购合同管理 5. 采购订单管理 6. 采购协同管理 7. 外部商城采购管理 8. 报表查询管理 9. 系统管理 10. 集成管理 资料获取&#xff1a;本文末个人名片。

了解压电传感器:压电效应

压电加速度计的个关键方面是压电效应。一般来说&#xff0c;压电材料在受到机械应力时可以产生电力。 相反&#xff0c;对压电材料施加电场可以使其变形并产生小的机械力。尽管大多数电子工程师都熟悉压电效应&#xff0c;但有时并没有完全理解这种有趣现象的细节。 更深入地…

visualbox搭建linux环境双网卡配置

文章目录 1. 双网卡模式简介2. 网络模式配置2.1 virtualBox说明2.2 host-only网络模式配置2.3 NAT网络模式配置 3. 虚拟主机网络设置3.1 网卡一设置3.2 网卡二设置 4. 网卡配置5. ssh访问 本篇的目的是为了搭建本地的linux测试环境用。 1. 双网卡模式简介 双网卡网络模式简介 …

期货交易如何定义趋势?

从任何交易周期来看&#xff0c;行情无非就处在趋势、震荡这两种情况中。如果我们再把一个新的趋势突破原来的状态&#xff0c;逐步成为有力量的趋势&#xff0c;叫做反转&#xff0c;那么可以有三个形态&#xff0c;即趋势形态、震荡形态、反转形态。 做交易的人&#xff0c;…

消息队列-RabbitMQ-延时队列实现

死信队列 DLX,全称为Dead-Letter-Exchange,死信交换机&#xff0c;死信邮箱。当消息在一个队列中变成死信之后&#xff0c;它能重新发送到另外一个交换器中&#xff0c;这个交换器就是DLX&#xff0c;绑定DLX的队列就称为死信队列。 导致死信的几种原因&#xff1a; ● 消息…

GIS开发程序员简历怎么写?

GIS开发或者是数据处理等相关岗位&#xff0c;其本质还是开发类技术岗位。所以怎么让你的简历脱颖而出&#xff0c;最最重要的就是&#xff0c;简历上要展现两点&#xff1a;你有能力能胜任此岗位和你有潜力可以快速胜任此岗位&#xff08;校招上也看中这点&#xff09;。 那G…

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

目录 0 专栏介绍1 什么是距离场&#xff1f;2 欧氏距离场计算原理3 双线性插值与欧式梯度场4 仿真实现4.1 ROS C实现4.2 Python实现 0 专栏介绍 &#x1f525;课程设计、毕业设计、创新竞赛、学术研究必备&#xff01;本专栏涉及更高阶的运动规划算法实战&#xff1a;曲线生成…

Easyui Datagrid 解决页面加载重复请求2次后端问题

现象 在页面刚刚打开时&#xff0c;页面加载完毕&#xff0c;显示查询数据&#xff0c;连续请求网络2次&#xff0c; 第一次是只携带了 分页参数&#xff1b; 第二次携带分页和查询参数 问题出现原因 html代码中利用class声明了datagrid&#xff0c;导致easyUI解析class代…

【Android】安卓开发的前景

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

PyQt5 生成py文件不能运行;pushButton点击事件;QTextEdit 获取输入框内容

目录 cant open file c.pyuic: c.pyuic $FileName$ -o $FileNameWithoutExtension$.p PyQt5 生成py文件不能运行 pushButton点击事件 QTextEdit 获取输入框内容 整体运行代码: Creating a Qt Widget Based Application | Qt Creator Manual cant open file c.pyuic: c.…

【论文阅读】-- DeepVisualInsight: 深度分类训练时空因果关系的时间旅行可视化

中文标题 摘要引言动机举例相关工作时间旅行可视化的属性符号定义邻居保护属性边界距离保持属性逆投影保持属性暂时保存属性 方法 δ \delta δ-边界估计(k)-BAVR综合体建设逆投影保持时间连续性 评估案例分析结论参考文献 摘要 了解深度学习模型的预测在训练过程中是如何形成…

Anritsu 安立 MS2720T 手持式频谱分析仪

Anritsu 安立 MS2720T 手持式频谱分析仪 频谱分析仪功能特点 频率范围&#xff1a; 9 kHz ~ 9 GHz、13 GHz 和 20 GHz测量&#xff1a; 占用的带宽、信道功率、ACPR、C/I、发射波罩、杂散发射、场强适用于 LTE(FDD & TDD)、CDMA、W-CDMA、WiMAX、GSM 和 TD-SCDMA 的 3G 和…

vue简介实例

先看样式 再看代码 <div v-else class"relative mt-4 h-44 cursor-pointer overflow-hidden rounded-xl"><divclass"absolute flex h-44 w-full blur-lg":style"{ backgroundImage: url(${currentSongList.list[0]?.coverImgUrl}) }"…

【Stable Diffusion教程】AI绘画工具SD如何安装使用?三种方法带你轻松上手!(附安装包和云端部署教程)

大家好&#xff0c;我是向阳 AI绘画专业工具Stable Diffusion在哪里用怎么安装&#xff1f;这一期给大家介绍三种使用SD的方法&#xff0c;无论你有没有专业显卡都能轻松上手SD哦&#xff5e; 一、SD本地部署秋葉安装包安装方法 如果你有进一步的需求&#xff0c;想要学习SD…

Linux下Shell脚本基础知识

主要参考视频&#xff1a; 这可能是B站讲的最好的Linux Shell脚本教程&#xff0c;3h打通Linux-shell全套教程&#xff0c;从入门到精通完整版_哔哩哔哩_bilibili 主要参考文档&#xff1a; Shell 教程 | 菜鸟教程 (runoob.com) Bash Shell教程 (yiibai.com) 先用视频入门&…

Python数据库编程指南:连接与操作SQLite与MySQL

目录 一、引言 二、SQLite数据库连接与操作 &#xff08;一&#xff09;安装SQLite库 &#xff08;二&#xff09;建立数据库连接 &#xff08;三&#xff09;执行SQL语句 &#xff08;四&#xff09;注意事项 三、MySQL数据库连接与操作 &#xff08;一&#xff09;安…

使用 Dapper 创建 Blazor Server SPA

介绍 Blazor 是 Microsoft 构建的一个新框架&#xff0c;用于使用 .NET 代码库创建交互式客户端 Web UI。 Dapper 是一个微型 ORM&#xff08;对象关系映射器&#xff09;&#xff0c;可帮助将本机查询输出映射到领域类。它是由 StackOverflow 团队构建并作为开源发布的高性能…

编写工具调用windeployqt+ldd为msys2 Qt应用程序生成完整发布包

文章目录 概要整体架构流程技术名词解释技术细节1. 界面设计2. 递归枚举文件3. 运行windeployqt4. 运行ldd并拷贝文件5. 驱动流程 小结完整工程链接 概要 在windows下&#xff0c;动态链接库一直是发布Qt程序最为头痛的问题。在msys2环境下&#xff0c;尤其如此。msys2的winde…