【.NET Core】多线程之线程池(ThreadPool)详解(二)

news2024/11/16 3:39:24

【.NET Core】多线程之线程池(ThreadPool)详解(二)

在上一篇《【.NET Core】多线程之线程池(ThreadPool)详解(一)》中我们详细讲解了,线程池概念,如何应用及其应用的场景。本文我们将着重讲解线程池的使用。
在这里插入图片描述

一、线程池原理

CLR线程池并不会在CLR初始化时立即建立线程,而是在应用程序要创建线程来运行任务时,线程池才初始化一个线程。线程池初始化时是没有线程的,线程池里的线程的初始化与其他线程一样,但是在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。直到应用程序再次向线程池发出请求时,线程池里挂起的线程就会再度激活执行任务。

这样既节省建立线程所造成的性能损耗,也可以让多个任务反复重用同一线程,从而在应用程序生存期内节约大量开销。

通过CLR线程池所建立的线程总是默认为后台线程,优先级数为ThreadPriotity.Normal

CLR线程池分为工作者线程(WorkerThreads)与I/O线程(CompletionPortThreads)两种:

工作者线程是主要用作管理CLR内部对象的运作,通常用于计算密集的任务。

I/O(Input/Output)线程主要用于与外部对象的运作,通常用于计算密集的任务。

二、通过ThreadPool.QueueUserWorkItem()方法创建线程池

const int cycleNum = 15;
static void Main(string[] args)
{
    // 设置CLR线程池中工作者线程与I/O线程最大数目和最小数目
    ThreadPool.SetMinThreads(1, 1);
    ThreadPool.SetMaxThreads(10, 10);
    for (int i = 1; i <= cycleNum; i++)
    {
       // 将方法派入队列,成功返回TURE否则异常System.ArgumentNullException
       ThreadPool.QueueUserWorkItem(new WaitCallback(testFun), i.ToString());
    }
    Console.WriteLine("主线程执行!");
    Thread.Sleep(5300);
    Console.WriteLine("主线程结束!");
    Console.ReadKey();
}
public static void testFun(object obj)
{
    Console.WriteLine(string.Format("{0}:第{1}个线 程,{2}当前线程名称", DateTime.Now.ToString(), obj.ToString(),Thread.CurrentThread.ThreadState));
    Thread.Sleep(5000);
}

从上面示例你会注意到ThreadPool线程没有Join方法。你无法通过任何直接方法确定线程是否已完成执行。一旦你在ThreadPool中排队工作项,主线程就会继续执行。如果要等到线程完成执行,则必须使用同步事件编写代码。

使用线程同步事件

线程同步事件有两种类型:

  1. ManualResetEvent这是一个像我们家中的普通门一样工作事件,你可以使用.Set()方法设置它并使用.Reset()方法重置(关闭)它。它将阻塞调用.WaitOne()的线程,直到它被设置。设置后,事件对象的状态将处于Set状态,直到你使用.Reset()方法手动重置它。
  2. AutoResetEvent-它的作用与ManualResetEvent相同,只是它的作用类似自动门。一旦你设置它,它运行通过调用.WaitOne()等待的线程通过,然后将自身重置回来。
static void Main(string[] args)
{
     ManualResetEvent myWaitHandle = new ManualResetEvent(false);
     ThreadPool.QueueUserWorkItem(new WaitCallback(RunThread), myWaitHandle);
     myWaitHandle.WaitOne();
     Console.WriteLine("ThreadPool thread has completed the Work and Set myWaitHandle");
     Console.ReadLine();
}

private static void RunThread(object state)
{
     ManualResetEvent waitHandleFromParent = (ManualResetEvent)state;
     Console.WriteLine("I am in ThreadPool Thread");
     Thread.Sleep(5000);
     Console.WriteLine("ThreadPool thread is going to exit");
     waitHandleFromParent.Set();
}

二、通过Task创建线程池

2010年引入的任务并行库中的任务类为你提供了上述两个问题的解决方法。许多人将任务与轻量级线程混淆,但任务不能与线程相提并论。任务只是一组要执行的作业。线程执行调度到TaskScheduler的任务。任务不保证并行处理,并根据资源的可用性进行调度。默认情况为任务衍生新线程。与ThreadThreadPool使用Task可以返回执行结果。

任务不是异步运行的,因为我们在主线程中调用task.Wait(),主线程被阻塞直到任务完成。任务非常适合使用async/await进行异步执行。下面将演示Task创建线程过程:

public static void Main(string[] args)
{
     var task = new Task(RunTask);
     task.Start();
     task.Wait();
     Console.WriteLine("Back to main thread. Task completed execution!");
     Console.ReadLine();
}
 
private static void RunTask()
{
     Console.WriteLine("I am in Task");
     Thread.Sleep(5000);
}

三、IasyncResult异步线程池

.NET Framework允许你异步调用任何方法。定义与你需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的BeginInvokeEndInvoke方法。

BeginInvoke方法用于启动异步调用。它与你需要异步执行的方法具有相同的参数,只不过还有两个额外的参数。BeginInvoke立即返回,不等待异步调用完成。BeginInvoke返回IasyncResult,可用于监视调用进度。

EndInvoke方法用于检索异步调用结果。调用BeginInvoke后可随时调用EndInvoke方法;如果异步调用未完成,EndInvoke将一直阻塞到异步调用完成。EndInvoke的参数包括你需要异步执行的方法的outref参数以及由BeginInvoke返回的IAsyncResult

//声明委托
public delegate void AsyncEventHandler();
//异步方法
void Event1()
{
  Console.WriteLine("Event1 Start");
  System.Threading.Thread.Sleep(4000);
  Console.WriteLine("Event1 End");
}

// 同步方法
void Event2()
{
  Console.WriteLine("Event2 Start");
  int i=1;
  while(i<1000)
  {
    i=i+1;
    Console.WriteLine("Event2 "+i.ToString());
  }
    Console.WriteLine("Event2 End");
}


static void Main(string[] args)
{
   long start=0;
   long end=0;
   Class1 c = new Class1();
   Console.WriteLine("ready");
   start=DateTime.Now.Ticks;
   //实例委托
   AsyncEventHandler asy = new AsyncEventHandler(c.Event1);
   //异步调用开始,没有回调函数和AsyncState,都为null
   IAsyncResult ia = asy.BeginInvoke(null, null);
   //同步开始,
   c.Event2();
    //异步结束,若没有结束,一直阻塞到调用完成,在此返回该函数的return,若有返回值。
   asy.EndInvoke(ia);
    //都同步的情况。
     end =DateTime.Now.Ticks;
   Console.WriteLine("时间刻度差="+ Convert.ToString(end-start) );
   Console.ReadLine();
}

四、总结

上面说过,.net framework 可以异步调用任何方法。所以异步用处广泛。

在.net framework 类库中也有很多异步调用的方法。一般都是已Begin开头End结尾构成一对,异步委托方法,外加两个回调函数和AsyncState参数,组成异步操作的宏观体现。所以要做异步编程,不要忘了委托delegate、Begin,End,AsyncCallBack委托,AsyncState实例(在回调函数中通过IAsyncResult.AsyncState来强制转换),IAsycResult(监控异步),就足以理解异步真谛了。

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

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

相关文章

测试C#调用OpenCvSharp和ViewFaceCore从摄像头中识别人脸

学习了基于OpenCvSharp获取摄像头数据&#xff0c;同时学习了基于ViewFaceCore的人脸识别用法&#xff0c;将这两者结合即是从摄像头中识别人脸。本文测试测试C#调用OpenCvSharp和ViewFaceCore从摄像头中识别人脸&#xff0c;并进行人脸红框标记。   新建Winform项目&#xf…

白盒测试?看这一篇就够了

白盒测试&#xff1f;看这一篇就够了 什么是白盒测试&#xff1a;白盒测试流程白盒测试技术白色测试分 2 个步骤进行白盒测试的特点白盒测试的优点白盒测试的缺点 五星上将麦克阿瑟曾经说过“在白盒测试面前&#xff0c;黑盒测试就是弟弟“ 什么是白盒测试&#xff1a; 白盒测…

10篇深度学习时间序列预测综述汇总!含金融、医疗、气象等领域应用!

在当今数据驱动的时代&#xff0c;时间序列预测在金融、医疗和气象等领域发挥着关键作用&#xff0c;而深度学习作为人工智能领域的重要分支&#xff0c;为解决时间序列预测问题提供了强大的工具。 为了帮助大家深入理解深度学习时间序列预测&#xff0c;这里整理了10篇深度学习…

springboot配置项动态刷新

文章目录 一&#xff0c;序言二&#xff0c;准备工作1. pom.xml引入组件2. 配置文件示例 三&#xff0c;自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四&#xff0c;yaml文件转换为java对象1. 无法使…

Oracle认证 | 甲骨文Oracle认证含金量高吗?

“考证”在各行各业中一直都是热度不减的话题&#xff0c;IT领域也不例外。 对于在校学生来说&#xff0c;并没有太多实践经验&#xff0c;证书在一定程度上就是找工作时的“敲门砖”&#xff0c;多张证书多条路&#xff1b; 对于职场人士来说&#xff0c;证书在升职加薪、跳…

基于springboot+vue的网上购物商城(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

【设计模式】张一鸣笔记:责任链接模式怎么用?

我将通过一个贴近现实的故事——请假审批流程&#xff0c;带你了解和掌握责任链模式。 什么是责任链模式&#xff1f; 责任链模式是一种行为设计模式&#xff0c;它让你可以避免将请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有处理请求的机会将这个对象连成一条…

【架构师专题】架构师如何做好业务架构?

作为一个优秀的架构师&#xff0c;必须要先训练自己的业务架构技能&#xff0c;但是要训练之前&#xff0c;一定要先理解“业务架构”的定义。 业务架构 那么什么是业务架构呢&#xff1f;这里我给大家梳理了一个比较准确的定义。 “业务架构”是一个企业或组织在运营过程中…

大模型日报-20240122

清华、小米、华为、 vivo、理想等多机构联合综述&#xff0c;首提个人LLM智能体、划分5级智能水平 https://mp.weixin.qq.com/s/JYB4BzsXhWF8pEUUkvn_GQ 想必这些唤醒词中至少有一个曾被你的嘴发出并成功呼唤出了一个能给你导航、讲笑话、添加日程、设置闹钟、拨打电话的智能个…

gradle构建spring-framework源码

5.3.22版本构建 通过启动的jvm参数配置代理下载 Could not download jruby-stdlib-9.2.20.1.jar (org.jruby:jruby-stdlib:9.2.20.1) Could not get resource https://repo.maven.apache.org/maven2/org/jruby/jruby-stdlib/9.2.20.1/jruby-stdlib-9.2.20.1.jar. Could not GE…

Vue3组件库开发 之Button(2) 未完待续

Vue3组件库开发 之Button(1) 中新建项目&#xff0c;但未安装成功ESLINT 安装ESLINT npm install eslint vite-plugin-eslint --save-dev 安装eslint后&#xff0c;组件文件出现错误提示 添加第三方macros &#xff0c;虽然不是官网但很多开发者都是vue3开发人员 安装macros…

SAP CDS VIEW实现行列转换

需求&#xff1a; 销售订单上的业务伙伴数据都在VBPA存储&#xff0c;根据PARVW来区分是售达方或者是送达方等等&#xff0c;有时候一些报表取数时有一些条件&#xff0c;比如售达方等于xxxxx并且送达方等于xxxxx&#xff0c;这时候就不是简单的一条sql就能搞定的事了&#xf…

基于扩散模型语音驱动人物头像说话模型:DreamTalk

1 DreamTalk介绍 DreamTalk&#xff1a;由清华大学、阿里巴巴和华中科大共同开发的一个基于扩散模型让人物头像说话的框架。 能够根据音频让人物头像照片说话、唱歌并保持嘴唇的同步和模仿表情变化。这一框架具有以下特点: DreamTalk能够生成高质量的动画&#xff0c;使人物脸…

前端转鸿蒙的就业前景如何?有必要学鸿蒙么?

学习鸿蒙开发是否有必要&#xff0c;取决于多个因素&#xff1a; 一、个人兴趣与职业规划&#xff1a; 如果你对华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;感兴趣&#xff0c;并且希望将这个平台作为你的职业发展的方向&#xff0c;那么学习鸿蒙开发是非常有意义的。…

ORA-01033: ORACLE initialization or shutdown in progress---惜分飞

客户反馈数据库使用plsql dev登录报ORA-01033: ORACLE initialization or shutdown in progress的错误 出现该错误一般是由于数据库没有正常open成功,查看oracle 告警日志发现 Mon Jan 22 16:55:50 2024 Database mounted in Exclusive Mode Lost write protection disabled …

93. 复原 IP 地址 - 力扣(LeetCode)

题目描述 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址&#xff0c;但是 “0.011.255.245”、“…

【Linux】vim中批量化注释

批量化注释 ctrlvhjkl进行区域选择shiftiI“//”esc*2 批量化删除注释 ctrlvhjkl进行区域选择&#xff08;包含且仅包含“//”-可以用L控制&#xff09;d删除

WIFI6与WIFI5的差异在哪里

在数字时代&#xff0c;随着无线网络的不断演进&#xff0c;WIFI技术作为我们日常连接的主要方式之一也在不断升级。在过去的几年里&#xff0c;WIFI5一直是许多用户的首选标准&#xff0c;为我们提供了可靠的无线连接。然而&#xff0c;如今WIFI6崭露头角&#xff0c;引入了一…

最详细PE文件格式讲解!!!!!

一&#xff1a;简单介绍和必须知道的知识点&#xff1a; 在介绍PE文件格式的细节前&#xff0c;仔细看一下下面图&#xff0c;该图展示了PE文件格式的大概布局&#xff0c;学习时建议配合使用PE工具——stud_PE。 1.1PE的基本概念 PE文件使用的是一个平面地址空间&#xff0c;所…

Nvidia DPU BlueField 软件概述_AI_卸载_降本增效_DPU时代_内核表示模型

Nvidia_BF_DPU简介 随着摩尔定律的减弱&#xff0c;加速计算和人工智能是较经济实惠的方式实现数据中心能源效率所需的工具。 让我们一起跟随和了解 NVIDIA Grace CPU、NVIDIA L4 GPU 和 NVIDIA BlueField DPU 如何推动数据中心迈向更高效的未来。 NVIDIA BlueField DPU 软件…