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();

CloudCone闪购优惠洛杉矶MC机房VPS月$1.99 便宜可随意删除重开

CloudCone商家我们很多喜欢低价便宜VPS主机的肯定是熟悉的,个人不是特别喜欢他。因为我之前测试过几次,开通的机器IP都是不通的,需要删除且开通好几次才能得到一个可用的IP地址。当然他们家的优势也是有的,就是价格确实便宜,而且还支持删除重新开通,而且机房只有一个洛杉矶MC。实话,如果他们家能多几个机房,保持现在的特点,还是有很多市场的。CloudCone是来自美国的主机销售商,成立于2017...

hosteons:10Gbps带宽,免费Windows授权,自定义上传ISO,VPS低至$21/年,可选洛杉矶达拉斯纽约

hosteons当前对美国洛杉矶、达拉斯、纽约数据中心的VPS进行特别的促销活动:(1)免费从1Gbps升级到10Gbps带宽,(2)Free Blesta License授权,(3)Windows server 2019授权,要求从2G内存起,而且是年付。 官方网站:https://www.hosteons.com 使用优惠码:zhujicepingEDDB10G,可以获得: 免费升级10...

819云互联(800元/月),香港BGP E5 2650 16G,日本 E5 2650 16G

819云互联 在本月发布了一个购买香港,日本独立服务器的活动,相对之前的首月活动性价比更高,最多只能享受1个月的活动 续费价格恢复原价 是有些颇高 这次819云互联与机房是合作伙伴 本次拿到机房 活动7天内购买独立服务器后期的长期续费价格 加大力度 确实来说这次的就可以买年付或者更长时间了…本次是5个机房可供选择,独立服务器最低默认是50M带宽,不限制流量,。官网:https://ww...

queueuserworkitem为你推荐
中国电信互联星空中国电信互联星空是什么!怎么取消百度抢票浏览器猎豹浏览器,360抢票,百度卫士抢票哪个抢票工具好?工信部备案怎样在工信部进行域名备案?要详细童之磊湖北中文在线数字出版有限公司怎么样?迅雷云点播账号求百度云或者迅雷云播账号密码人人逛街人人逛街评论怎么不显示链接了?好像4月28日就不能显示了。是什么原因呢?mate8价格华为mate8什么时候会降价虚拟机软件下载求一个免费虚拟机软件!!!请发送下载网站给我发邮件怎么发发邮件怎么发?qq等级表谁能告诉我QQ等级列表?
免备案虚拟空间 域名是什么 免费注册网站域名 大硬盘 wavecom 亚洲小于500m 免费网站申请 毫秒英文 刀片服务器是什么 nerds 中国电信宽带测速器 114dns 宿迁服务器 广东服务器托管 googlevoice cdn加速技术 ubuntu安装教程 西部主机 卡巴斯基免费版 screen 更多