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

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的方法里,怎么写才是真的让线程池来分线程工作?
...全文
262 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:
            } 
}
}
内容概要:本文围绕“多主体综合能源系统+分布式ADMM研究”展开,系统阐述了交替方向乘子法(ADMM)在多主体综合能源系统中的分布式优化应用,提供了完整的Matlab代码实现。研究聚焦于多利益主体之间的协同优化问题,通过建立合理的数学模型,采用ADMM算法实现去中心化的求解架构,有效保障各主体的数据隐私性与决策自主性,同时提升整体系统的计算效率与优化性能。内容涵盖系统建模、优化问题分解、ADMM迭代求解流程、收敛性验证及结果分析,具有较强的理论深度与工程实践价值,适用于能源互联网、微电网群、园区综合能源系统等复杂场景的能量管理与协调调度。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、高校科研人员,以及从事综合能源系统规划、微电网优化、分布式能源管理等方向的工程技术人员。; 使用场景及目标:①应用于多主体参与的综合能源系统能量管理与协同优化调度;②帮助读者深入理解ADMM算法的分解-协调机制及其在分布式优化中的具体实现,支撑高水平学术论文复现、科研课题攻关或实际工程项目开发;③推动智能电网与能源互联网中去中心化、隐私保护型优化调度技术的发展与落地; 阅读建议:建议读者结合文中提供的Matlab代码进行动手实践,逐行调试并可视化关键变量的迭代过程,深入掌握ADMM算法的参数设置、收敛判据及数值稳定性处理技巧,并尝试将其拓展至电动汽车集群调度、多微电网互动、可再生能源消纳等其他分布式优化应用场景中进行仿真验证。

62,271

社区成员

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

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

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

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