ThreadPool.QueueUserWorkItem的性能问题
来源:互联网 发布:淘宝短链接生成 编辑:程序博客网 时间:2024/05/16 08:15
在WEB开发中,为了减少页面等待时间提高用户体验,我们往往会把一些浪费时间的操作放到新线程中在后台运行。
简单的实现代码就是:
但是对于一个请求量大的网址这样做是很不现实的——每一个操作都要开启一个新线程,最终会因CPU不堪重负而使网站挂掉。
更好的做法是使用线程队列。
对于线程队列 ThreadPool.QueueUserWorkItem 很多人应该都不陌生,下边看微软的解释:
将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
它的作用就是将一些操作放入当前线程之外的另外一个线程中执行,它的使用方法很简单:
它相对代码一的优点是会利用已经创建过的空闲的线程,如果没有空闲就排队,而不会盲目的一直创建下去。
但是它并没有摆脱“创建新线程”的问题:过多的线程会占用更多的资源。由此我们不难想到,我们为什么不自己搞个队列,让它们在同一个线程中逐个执行?对此,我写了个简单的实现类:
该类的使用很简单:
BackgroundTasks.Add((obj)=>{
Console.WriteLine("这个任务的添加时间是:{0}", obj as DateTime);
}, DateTime.Now);
还有一个“实例版”的,就是针对每个方法,分别创建一个任务队列:
调用示例:
这个设计既解决了异步执行,又解决了占用资源的问题。
但是世界上没有完美的东西,代码也是如此,由于队列中的任务是单线程执行,可能会导致某些任务在很长时间后才会被执行到,或者重启IIS导致很多任务还没有被执行就被丢弃。
无论怎么,这种设计还是适用于很多“一般情况”。
阅读全文
0 0
- ThreadPool.QueueUserWorkItem的性能问题
- ThreadPool.QueueUserWorkItem的性能问题
- ThreadPool.QueueUserWorkItem性能测试与提高
- ThreadPool.QueueUserWorkItem
- ThreadPool,WaitCallback,QueueUserWorkItem
- ThreadPool.QueueUserWorkItem 用法
- C#ThreadPool.QueueUserWorkItem实例
- ThreadPool.QueueUserWorkItem 方法 (WaitCallback)
- 一个关于WaitCallback和ThreadPool.QueueUserWorkItem的小例子
- ThreadPool.QueueUserWorkItem 方法 (WaitCallback, Object)
- 解决Thread性能问题:ThreadPool
- Thread.Start()与ThreadPool.QueueUserWorkItem实现多线程的两种方式的对比
- [原创] 难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
- 难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
- C# ThreadPool.QueueUserWorkItem典型案例详解
- 使用ThreadPool.QueueUserWorkItem记录网站错误日志
- 对threadpool的性能测试
- WPF使用ThreadPool.QueueUserWorkItem线程池防界面假死
- pat 1013. Battle Over Cities (25)
- C# yyyyMMddHHmmss格式转换DateTime
- CSS鼠标滑动显示标题全部移开显示几个字符
- leetcode(4) Median of Two Sorted Arrays
- faster-rcnn 之 bbox_transform_inv(boxes, deltas)
- ThreadPool.QueueUserWorkItem的性能问题
- 产品经理与项目经理的区别
- Ubuntu 终端常用命令
- 仿京东底部导航栏实现
- eclipse中svn插件突然出现错误,不能连接svn了:Could not create the view: org.tigris.subversion.subclipse.ui.repositor
- Realm数据库框架的使用例子
- Scala 学习笔记(五)------定义函数指定默认参数
- [C#]扩展方法
- css学习笔记之vertical-align