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

HostSailor:罗马尼亚机房,内容宽松;罗马尼亚VPS七折优惠,罗马尼亚服务器95折

hostsailor怎么样?hostsailor成立多年,是一家罗马尼亚主机商家,机房就设在罗马尼亚,具说商家对内容管理的还是比较宽松的,商家提供虚拟主机、VPS及独立服务器,今天收到商家推送的八月优惠,针对所有的产品都有相应的优惠,商家的VPS产品分为KVM和OpenVZ两种架构,OVZ的比较便宜,有这方面需要的朋友可以看看。点击进入:hostsailor商家官方网站HostSailor优惠活动...

RAKsmart 黑色星期五云服务器七折优惠 站群服务器首月半价

一年一度的黑色星期五和网络星期一活动陆续到来,看到各大服务商都有发布促销活动。同时RAKsmart商家我们也是比较熟悉的,这次是继双十一活动之后的促销活动。在活动产品中基本上沿袭双11的活动策略,比如有提供云服务器七折优惠,站群服务器首月半价、还有新人赠送红包等活动。如果我们有需要RAKsmart商家VPS、云服务器、独立服务器等产品的可以看看他们家的活动。这次活动截止到11月30日。第一、限时限...

Digital-vm80美元,1-10Gbps带宽日本/新加坡独立服务器

Digital-vm是一家成立于2019年的国外主机商,商家提供VPS和独立服务器租用业务,其中VPS基于KVM架构,提供1-10Gbps带宽,数据中心可选包括美国洛杉矶、日本、新加坡、挪威、西班牙、丹麦、荷兰、英国等8个地区机房;除了VPS主机外,商家还提供日本、新加坡独立服务器,同样可选1-10Gbps带宽,最低每月仅80美元起。下面列出两款独立服务器配置信息。配置一 $80/月CPU:E3-...

queueuserworkitem为你推荐
在线漏洞检测漏洞扫描工具有哪些无线路由器限速设置无线路由器限速怎么设置!金山杀毒怎么样金山杀毒怎么样?渗透测试网站渗透测试怎么做?依赖注入什么是侵入性?还有依赖注入?淘宝店推广淘宝店铺推广有哪些渠道?网易公开课怎么下载如何下载网易公开课ios系统iOS系统是什么机械键盘轴打游戏用机械键盘到底什么轴好?电子商务网站模板网页制作模板
山东虚拟主机 vps侦探 花生壳免费域名申请 科迈动态域名 香港机房托管 英语简历模板word web服务器架设软件 165邮箱 135邮箱 isp服务商 华为云服务登录 腾讯总部在哪 畅行云 美国迈阿密 架设代理服务器 挂马检测工具 赵蓉 国外bt网站 web服务器安全配置 web服务器搭建软件 更多