queueuserworkitemBeginInvoke,ThreadPool,Task三类异步方法的区别和速度比较

queueuserworkitem  时间:2021-01-17  阅读:()

用thread pool有什么好处,有什么坏处

许多应用程序创建的线程都要在休眠状态中消耗大量时间,以等待事件发生。

其他线程可能进入休眠状态,只被定期唤醒以轮询更改或更新状态信息。

线程池通过为应用程序提供一个由系统管理的辅助线程池使您可以更为有效地使用线程。

一个线程监视排到线程池的若干个等待操作的状态。

当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数。

  托管线程池中的线程为后台线程,即它们的 IsBackground 属性为 true。

这意味着在所有的前台线程都已退出后,ThreadPool 线程不会让应用程序保持运行。

  也可以将与等待操作不相关的工作项排列到线程池。

若要请求由线程池中的一个线程来处理工作项,请调用 QueueUserWorkItem 方法。

此方法将对将被从线程池中选定的线程调用的方法或委托的引用用作参数。

一个工作项排入队列后就无法再取消它。

  计时器队列中的计时器以及已注册的等待操作也使用线程池。

它们的回调函数也会排列到线程池。

  每个进程都有一个线程池。

线程池的默认大小为每个可用处理器有 25 个线程。

使用 SetMaxThreads 方法可以更改线程池中的线程数。

每个线程使用默认的堆栈大小并按照默认的优先级运行。

threadpool.queueuserworkitem 需要什么配置信息

怎样关闭线程池中的线程,怎么查看线程池中的线程执行完毕? 部分代码实例 private void FrmSetCash_Load(object sender, EventArgs e) { bool o = true; ThreadPool.QueueUserWorkItem(new WaitCallback(InitdgvCash), o); } public delegate void ShowProgressDelegate(bool visiable); public delegate void HideProgressDelegate(DataSet ds); //同步更新UI private void ShowProgress(bool visiable) { if (this.InvokeRequired) { ShowProgressDelegate oShowProgress = new ShowProgressDelegate(ShowProgress); this.Invoke(oShowProgress, new object[] { visiable }); } else { this.myLoadingProgress.Visible = visiable; this.myLoadingProgress.Start(); } } private void HideProgress(DataSet ds) { if (this.InvokeRequired) { HideProgressDelegate oShowProgress = new HideProgressDelegate(HideProgress); this.Invoke(oShowProgress, new object[] { ds }); } else { this.dgvCash.DataSource = ds.Tables[0]; SetHeaderText(dgvCash); this.myLoadingProgress.Visible = false; (); } } private void InitdgvCash(object o) { ShowProgress(bool.Parse(o.ToString())); BLL.Cash oCash = new BLL.Cash(); using (DataSet ds = oCash.GetList()) { HideProgress(ds); } }

如何写线程池

因工作需要,需要写一个简单的线程池,一开始觉得无从下手,待慢慢理清思路,写代码就很顺利了,先将这个线程池实现思路简单的贴一下,主要有init_pool(), rounted(), add_work(), void *woke(), destory_pool()等函数: init_pool():完成线程池的初始化工作。

主要工作有:初始化任务队列,初始化锁,初始化条件锁,初始化线程,并给线程注册rounted()函数,使各线程执行rounted函数。

rouned() :各个线程创建后执行此函数,此函数中是一个死循环,线程进入循环后,先判断是否有任务,有则将任务从任务队列中取出执行(任务中含有要执行的函数指针即void *woke()和相关参数),任务数减一,没有任务则阻塞住,等待有任务时触发条件锁然后继续执行该任务。

add_work():此函数是向任务队列中添加任务,即添加线程实际执行的函数指针以及该函数指针需要的参数,任务数加一。

void *woke():此函数指针是我们实际需要执行的函数,定义为指针是方便向线程传递。

destory_pool():此函数的主要是销毁线程池,等待子线程结束后,销毁各种资源。

上述是一个简单的线程池的实现,理清了思路,写代码就不是问题了。

Ps:学会积累,学会沉淀。

BeginInvoke,ThreadPool,Task三类异步方法的区别和速度比较

速度(最快为1) 返回值 多参数 等待在时限内完成 超时后结束 ThreadPool.UnsafeQueueUserWorkItem() 1 非原生支持1 非原生支持 非原生支持3 不支持 ThreadPool.QueueUserWorkItem() 2.7 非原生支持1 非原生支持 非原生支持3 不支持 Task() 4.5 支持2 非原生支持 支持 自愿结束 Delegate.BeinInvoke() 25.4 非原生支持1 支持 支持4 不支持 Thread.Start() 11009 非原生支持1 非原生支持 非原生支持3 支持 如ThreadPool.UnsafeQueueUserWorkItem(()=>result=Add(1,2)); 用Task<> 里面在程序末尾EventWaitHandle.Set(),外面WaitOne(TimeSpan)。

获得BeginInvoke的返回值asyncResult,再调asyncResult.AsyncWaitHandle.WaitOne();

爱用云互联租用服务器租美国、日本、美国、日本、购买2天内不满意可以退换,IP可免费更换!

爱用云互联怎么样?爱用云是一家成立于2018年的老牌商家旗下的服务器销售品牌,是正规持证IDC/ISP/IRCS商家,主要销售国内、中国香港、国外服务器产品,线路有腾讯云国外线路、自营香港CN2线路等,都是中国大陆直连线路,非常适合免备案建站业务需求和各种负载较高的项目,同时国内服务器也有多个BGP以及高防节点。专注为个人开发者用户,中小型,大型企业用户提供一站式核心网络云端服务部署,促使用户云端...

创梦云 香港沙田、长沙联通2核1G仅需29元一个月 挂机宝7元一个月

商家介绍:创梦云是来自国内的主机销售商,成立于2018年4月30日,创梦云前期主要从事免备案虚拟主机产品销售,现在将提供5元挂机宝、特惠挂机宝、香港云服务器、美国云服务器、低价挂机宝等产品销售。主打高性价比高稳定性挂机宝、香港云服务器、美国云服务器、香港虚拟主机、美国虚拟主机。官方网站:http://cmy0.vnetdns.com本次促销产品:地区CPU内存硬盘带宽价格购买地址香港特价云服务器1...

UCloud年度大促活动可选香港云服务器低至年134元

由于行业需求和自媒体的倾向问题,对于我们个人站长建站的方向还是有一些需要改变的。传统的个人网站建站内容方向可能会因为自媒体的分流导致个人网站很多行业不再成为流量的主导。于是我们很多个人网站都在想办法进行重新更换行业,包括前几天也有和网友在考虑是不是换个其他行业做做。这不有重新注册域名重新更换。鉴于快速上手的考虑还是采用香港服务器,这不腾讯云和阿里云早已不是新账户,考虑到新注册UCLOUD账户还算比...

queueuserworkitem为你推荐
无线路由器限速设置路由器里面限速参数如何设置?蘑菇街美丽说蘑菇街、美丽说这类网站前期是怎么推广的?如何建立自己的网站怎么创建自己的网站怎么点亮qq空间图标怎样点亮qq空间的图标数据库损坏数据库损坏是怎么回事啊?免费免费建站最好的免费建站免费qq空间装扮有办法免费装扮QQ空间吗??lockdowndios8.1能用gpp3to2吗?型号A1429lockdownd[求教]在淘宝买了张激活卡,请问怎么取消激活2012年正月十五2012年正月十五 几月几号
高防服务器租用qy 安徽双线服务器租用 德国vps 动态域名解析软件 ftp空间 美国翻墙 美国主机推荐 韩国加速器 rak机房 优key 线路工具 NetSpeeder 云主机51web 主机合租 湖南服务器托管 刀片服务器的优势 新家坡 重庆双线服务器托管 昆明蜗牛家 阿里云免费邮箱 更多