首页 > 编程语言 >c#多线程并发执行一个操作函数

c#多线程并发执行一个操作函数

时间:2023-08-08 10:36:10浏览次数:33  
标签:10 c# 并发 int 线程 whs AutoResetEvent 多线程 sortIdx



有时候我们进行很多的数据对比运算时,单线程的程序显得很慢,这个时候可以用多线程并发运行:




int maxThread = 10;  //10个并发线程
            int currTNum = 0;


            


            WaitHandle[] whs = new WaitHandle[maxThread];  //WaitHanle类MSDN上的定义: 封装了一些对象,这些对象等待着独占访问共享资源,这里相当于占用10个资源的意思


           
            for (int i = 0; i < whs.Length; i++)
            {
                whs[i] = new AutoResetEvent(false);   //AutoResetEvent是一个开关,设置为true时,whs占用资源对象就会自动启动. 设置为false时,只有进行 AutoResetEvent.set()之后才能启动
            }
            int sortIdx = 0;

//循环遍历一千个参数,对这1000个参数进行并发执行 Dotask()函数
             for (int i= 0;i<1000;i++)
                {


                    var ex = i;            


                  
                    currTNum++;  //线程数加一
                    if (currTNum >= maxThread)
                    {
                     //当前线程数大于或者等于最大线程数时 ,即10个线程数全部被占满,这时等待释放资源,把释放资源的线程编号给sortldx
                        int freeIdx = WaitHandle.WaitAny(whs); 
                        currTNum--;
                        sortIdx = freeIdx;
                    }
                    else
                    {
                //10个线程未占满时,依次给编号0到9
                        sortIdx = currTNum - 1;
                    }


                  


                  //线程池队列,依次执行线程
                        ThreadPool.QueueUserWorkItem(new WaitCallback((p) =>
                        {
                         
                          Dotask(p);  //要执行的函数,这里的p等于ex的内容
                            (whs[sortIdx] as AutoResetEvent).Set();
                        }), ex);   //唤醒线程


                    }



如果在for()循环外直接加  Messagebox.show("结束了"); 会发现 有时候已经弹出窗口了,但 仍有线程在运行。

这是因为for()循环虽然进行完了,但线程池中仍有线程在等待执行.



那我们什么时候才知道任务执行完了呢   这里我们要判断线程池中的线程是否执行完 执行完了 再弹出提示


int maxWorkerThreads, workerThreads;
                int portThreads;
                ThreadPool.GetMaxThreads(out maxWorkerThreads, out 


portThreads);
                ThreadPool.GetAvailableThreads(out workerThreads, out 


portThreads);
                if (maxWorkerThreads - workerThreads == 0)
                {
                 Messagebox.show("结束了");
                    break;
                }







标签:10,c#,并发,int,线程,whs,AutoResetEvent,多线程,sortIdx
From: https://blog.51cto.com/u_16218512/7005048

相关文章

  • c#文件流读写
    读写的完整流程例子可参考:stream简单读写excel写文件:stringdemo="写入txt中";StreamWriterdemo_log=null;demo_log=File.CreateText("demo_log.txt");demo_log.WriteLine(demo,Encoding.GetEncoding("gb2312"));demo_log.Close();写后......
  • 易基因:m5C RNA甲基转移酶及其在癌症中的潜在作用机制|深度综述
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。近年来,5-甲基胞嘧啶(m5C)RNA修饰已成为通过编码和非编码RNA调控RNA代谢和功能的关键参与者。越来越多的证据表明,m5C可以调控RNA稳定性、翻译、转录、出核和切割,以及介导细胞增殖、分化、凋亡、应激反应和其他生物学功能......
  • FinClip 支持小程序维度域名配置;桌面端体验活动进行中
    FinClip的使命是使您(业务专家和开发人员)能够通过小程序解决关键业务流程挑战,并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点,看看是否有助于您实现目标。产品方面的相关动向......
  • 【HMS Core】Health Kit 血压、血糖等数据返回数据包含max,min,avg,last 数据,这些数据
    【问题描述】1. 血压、血糖等数据返回数据包含max,min,avg,last数据,这些数据的含义是什么意思?2. 如何获取用户上传健康数据的腕表的型号【解决方案】1、血压原子采样统计数据类型开放的是多日统计查询接口,统计的维度是按照自然日进行统计的。最大最小以及平均值是指这一天的最大......
  • No input file specified. thinkphp 高版本正则重写问题
    Noinputfilespecified.问题描述:使用TP框架做项目时,在启用REWRITE的伪静态功能的时候,首页可以访问,但是访问其它页面的时候,就提示:“Noinputfilespecified.”原因在于使用的PHP5.6是fast_cgi模式,而在某些情况下,不能正确识别path_info所造成的错误默认的.htaccess里面的规则:......
  • Siemens 西门子博途、经典wincc、经典SETP7的区别
    博途软件介绍:博途软件是西门子在2010年11月23日发布的一个野心勃勃的、号称“全集成自动化(TIA=TotalIntegratedAutomation,全集成自动化)”的软件系统,西门子声称该产品是业内首个采用统一工程组态和软件项目环境的自动化软件,使用户能够快速、直观地开发和调试自动化系......
  • c#操作mongodb防止重复插入
    原理:把可以唯一标识的字段提出来放在字符串列中,当字符串不包含要插入的数据时再进行数据操作MongoClientclient;MongoServerserver;MongoDatabasedatabase;client=newMongoClient("mongodb://192.168.0.4");serv......
  • FactoryPattern-工厂模式
    在C#中,工厂模式(FactoryPattern)是一种常用的设计模式,它属于创建型模式。在C#中,工厂模式用于创建对象,而不需要直接使用构造函数来实例化对象。它通过一个工厂类来封装对象的创建逻辑,使得客户端只需要与工厂类交互,而无需关心具体的对象创建过程。1.简单工厂简单工厂模式(SimpleFac......
  • 遇到的问题-----c#操作mongodb用foreach遍历集合报错curcor not found
    foreach(varttdocindatabase.GetCollection("集合名").FindAll()){}执行了一部分就报错curcornotfound了 原因是curcor有一定的时限如果数据太多的话可考虑分几部分来处理vardata=database.GetCollection("集合名");......
  • C#把mongodb导入sqlsever
    原理很简单 就是把mongodb中的数据提出来插入sqlsever中首先要在mongodb中添加mongodb字段和sqlsever字段对应的集合field。格式:{"sqlsever字段":"name","mongodb字段":"name"}MongoClientclient;MongoServerserver;MongoData......