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

hostyun评测香港原生IPVPS

hostyun新上了香港cloudie机房的香港原生IP的VPS,写的是默认接入200Mbps带宽(共享),基于KVM虚拟,纯SSD RAID10,三网直连,混合超售的CN2网络,商家对VPS的I/O有大致100MB/S的限制。由于是原生香港IP,所以这个VPS还是有一定的看头的,这里给大家弄个测评,数据仅供参考!9折优惠码:hostyun,循环优惠内存CPUSSD流量带宽价格购买1G1核10G3...

justhost:“第4次VPS测评”,8.3元/月,200M带宽,不限流量,KVM虚拟,4个俄罗斯机房应有适合你的

justhost.ru官方来消息说已经对网络进行了比较全面的优化,针对中国电信、联通、移动来说,4个机房总有一个适合中国用户,让站长进行一下测试,这不就有了这篇有关justhost的VPS的第四次测评。本帖主要关注的是网络,对于其他的参数一概不管! 官方网站:https://justhost.ru 最低配VPS:8.3元/月,KVM,512M内存,5G硬盘,200M带宽,不限流量 购买链接:...

Vultr新注册赠送100美元活动截止月底 需要可免费享30天福利

昨天晚上有收到VULTR服务商的邮件,如果我们有清楚的朋友应该知道VULTR对于新注册用户已经这两年的促销活动是有赠送100美元最高余额,不过这个余额有效期是30天,如果我们到期未使用完的话也会失效的。但是对于我们一般用户来说,这个活动还是不错的,只需要注册新账户充值10美金激活账户就可以。而且我们自己充值的余额还是可以继续使用且无有效期的。如果我们有需要申请的话可以参考"2021年最新可用Vul...

queueuserworkitem为你推荐
人人时光机求徐智勇的时光机的歌词,百度上全是周杰轮跟五月天的,我要粤语啊天天酷跑刷积分教程天天酷跑积分怎么获得 天天酷跑刷积分方法mate8价格华为mate8市场价多少linux虚拟机怎么样在Linux下安装虚拟机虚拟机软件下载那里可以下载虚拟系统,又该怎么安装呢??freebsd安装FreeBSD下如何安装ports的方法去鼠标加速度请教如何正确的去处鼠标加速度~手工杀毒手工杀毒与杀毒软件杀毒有什么区别?office2007简体中文版office2007下载安装价格在线qq号码价值在线评估
国际域名抢注 sugarhosts 免费申请网页 plesk blackfriday godaddy续费优惠码 godaddy 搜狗12306抢票助手 论坛空间 ftp教程 免费全能主机 tna官网 qq云端 如何注册阿里云邮箱 国外ip加速器 域名dns 重庆电信服务器托管 美国凤凰城 cdn网站加速 服务器硬件配置 更多