关于线程池的一些疑惑,望大侠给予解答!!!!!

generhappy 2014-09-11 01:59:46
假如说,我有大量的循环操作需要执行,我开启了线程池,我应该如何使用这个线程池来执行我的操作

void start()
{
for (int i = 0; i < a.Count; i++)
{
string b= a[i].ToString();
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), b);
}
}
static void DoWork(object state)
{
//执行我的操作
}

我的a的count有很多,我这种写法对么,还是只应该调用一次ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), b)
循环操作应该放在DoWork的方法里,怎么写才是真的让线程池来分线程工作?
...全文
184 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 generhappy 的回复:
为什么我无论用哪种方法,都没有感觉有速度的提升呢?
谁告诉线程就一定提高速度,而不是降低速度? 你提不出具体实际的例子,空谈技术,谁能知道为什么速度没有提升呢?
  • 打赏
  • 举报
回复
引用 楼主 generhappy 的回复:
假如说,我有大量的循环操作需要执行,我开启了线程池,我应该如何使用这个线程池来执行我的操作

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

void start()
{
 ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork),);

static void DoWork(object state)
{
    //执行我的操作
for (int i = 0; i < a.Count; i++)
            {
                string b= a[i].ToString();
                // TODO:
            } 
}
}

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧