问题描述
假如说,我有大量的循环操作需要执行,我开启了线程池,我应该如何使用这个线程池来执行我的操作voidstart(){for(inti=0;i<a.Count;i++){stringb=a[i].ToString();ThreadPool.QueueUserWorkItem(newWaitCallback(DoWork),b);}}staticvoidDoWork(objectstate){//执行我的操作}
我的a的count有很多,我这种写法对么,还是只应该调用一次ThreadPool.QueueUserWorkItem(newWaitCallback(DoWork),b)循环操作应该放在DoWork的方法里,怎么写才是真的让线程池来分线程工作?
解决方案
解决方案二:
这么奢侈?开这么多线程池?你是要干嘛····这样改改:voidstart(){ThreadPool.QueueUserWorkItem(newWaitCallback(DoWork),);staticvoidDoWork(objectstate){//执行我的操作for(inti=0;i<a.Count;i++){stringb=a[i].ToString();//TODO:}}}
解决方案三:
引用1楼yuekunge的回复:
这么奢侈?开这么多线程池?你是要干嘛····这样改改:[/code]
voidstart(){ThreadPool.QueueUserWorkItem(newWaitCallback(DoWork));}staticvoidDoWork(objectstate){//执行我的操作for(inti=0;i<a.Count;i++){stringb=a[i].ToString();//TODO:}}
解决方案四:
楼主的代码是对的,那个是把线程加入线程池
解决方案五:
额,楼上的两位,给出的答案正好相反啊。。。。到底哪个是对的?
解决方案六:
额,到底怎样写才是对的啊。。。。
解决方案七:
为什么我无论用哪种方法,都没有感觉有速度的提升呢?
解决方案八:
首先确保开多个线程能确实解决你的问题的前提下建议开和cpu核数量差不多线程即可所有任务一次性放进线程池,那只是避免阻塞主线程,并没有提高效率每个任务分开放进线程池,任务量大的情况,会导致线程池资源紧缺,出现任务排队,大量线程导致cpu上下文切换也会消耗时间所以开若干线程平均分配任务即可,可以根据实际情况调整线程个数
解决方案九:
引用7楼newxdlysk的回复:
首先确保开多个线程能确实解决你的问题的前提下建议开和cpu核数量差不多线程即可所有任务一次性放进线程池,那只是避免阻塞主线程,并没有提高效率每个任务分开放进线程池,任务量大的情况,会导致线程池资源紧缺,出现任务排队,大量线程导致cpu上下文切换也会消耗时间所以开若干线程平均分配任务即可,可以根据实际情况调整线程个数
你的意思是不需要用线程池,而是自己来控制新建线程么,因为线程池我无法控制线程池里有多少个线程在跑我的方法
解决方案十:
首先,需要确定你的任务到底是操作IO还是操作内存如果是操作IO,外部设备比CPU慢的太多,CPU会有很多等待的时间,利用等待的时间切换到其他线程,是可以很大的提高效率的而如果是内存操作,CPU与内存的交流速度非常快,跟CPU本身的执行基本一致,CPU一直在忙碌,你让它来回切换线程,反而降低效率
解决方案十一:
操作IO,包括硬盘,串口,以太网,等等操作内存,包括赋值,计算,实例化内存对象等等
解决方案十二:
引用楼主generhappy的回复:
假如说,我有大量的循环操作需要执行,我开启了线程池,我应该如何使用这个线程池来执行我的操作voidstart(){for(inti=0;i<a.Count;i++){stringb=a[i].ToString();ThreadPool.QueueUserWorkItem(newWaitCallback(DoWork),b);}}staticvoidDoWork(objectstate){//执行我的操作}我的a的count有很多,我这种写法对么,还是只应该调用一次ThreadPool.QueueUserWorkItem(newWaitCallback(DoWork),b)循环操作应该放在DoWork的方法里,怎么写才是真的让线程池来分线程工作?
这样写一点问题也没有。但是问题是,你打算用它执行什么呢?最好每一次都举出一个实际的例子。真正好的程序设计师,花精力放在“实际例子(实际需求)上”,而不是为了技术而拼凑技术。
解决方案十三:
引用6楼generhappy的回复:
为什么我无论用哪种方法,都没有感觉有速度的提升呢?
谁告诉线程就一定提高速度,而不是降低速度?你提不出具体实际的例子,空谈技术,谁能知道为什么速度没有提升呢?