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

收到几个新商家投稿(HostMem,无忧云,青云互联,TTcloud,亚洲云端,趣米云),一起发布排名不分先后

7月份已经过去了一半,炎热的夏季已经来临了,主机圈也开始了大量的夏季促销攻势,近期收到一些商家投稿信息,提供欧美或者亚洲地区主机产品,价格优惠,这里做一个汇总,方便大家参考,排名不分先后,以邮件顺序,少部分因为促销具有一定的时效性,价格已经恢复故暂未列出。HostMem部落曾经分享过一次Hostmem的信息,这是一家提供动态云和经典云的国人VPS商家,其中动态云硬件按小时计费,流量按需使用;而经典...

sharktech:老牌高防服务器商,跳楼价,1G独享$70、10G共享$240、10G独享$800

不知道大家是否注意到sharktech的所有服务器的带宽价格全部跳楼跳水,降幅简直不忍直视了,还没有见过这么便宜的独立服务器。根据不同的机房,价格也是不一样的。大带宽、不限流量比较适合建站、数据备份、做下载、做流媒体、做CDN等多种业务。 官方网站:https://www.sharktech.net 付款方式:比特币、信用卡、PayPal、支付宝、西联汇款 以最贵的洛杉矶机器为例,配置表如...

Sharktech10Gbps带宽,不限制流量,自带5个IPv4,100G防御

Sharktech荷兰10G带宽的独立服务器月付319美元起,10Gbps共享带宽,不限制流量,自带5个IPv4,免费60Gbps的 DDoS防御,可加到100G防御。CPU内存HDD价格购买地址E3-1270v216G2T$319/月链接E3-1270v516G2T$329/月链接2*E5-2670v232G2T$389/月链接2*E5-2678v364G2T$409/月链接这里我们需要注意,默...

queueuserworkitem为你推荐
yy频道中心yy语音怎么进频道中心站长故事爱迪生发明电灯的故事简短bluestacksbluestacks到底是叫蓝手指还是叫蓝叠公章制作制作公章尺寸标准大小,字体,字号?天天酷跑刷金币如何使用八门神器给天天酷跑刷钻刷金币mate8价格华为麦特八多少价格bt封杀现在是全面封杀BT下载了吗?现在都找不到BT下载影片了ios系统ios系统有哪些版本?发邮件怎么发怎样发邮件?怎样申请支付宝怎样申请支付宝?
广东服务器租用 域名备案批量查询 最便宜虚拟主机 日本软银 googleapps 腾讯云数据库 特价空间 绍兴高防 最好的空间 联通网站 谷歌台湾 贵阳电信 宿迁服务器 websitepanel 西部数码主机 iptables vim命令 29美元 瓦工招聘 ddos攻击器 更多