首页 > 编程语言 >C# 的SmartThreadPool线程使用

C# 的SmartThreadPool线程使用

时间:2024-03-18 11:34:18浏览次数:21  
标签:线程 C# 任务 stp SmartThreadPool new smartThreadPool

1、为什么需要使用线程池(Thread Pool)
减少线程间上下文切换。线程执行一定的时间片后,系统会自动把cpu切换给另一个线程使用,这时还需要保存当前的线程上下文状态,并加载新线程的上下文状态。当程序中有大量的线程时,每个线程分得的时间片会越来越少,可能会出现线程未处理多少操作,就需要切换到另一线程,这样频繁的线程间上下文切换会花费大量的cpu时间。
减少内存占用。系统每创建一条物理线程,需要大概花费1MB的内存空间,许多程序喜欢先创建多条物理线程,并周期轮询来处理各自的任务,这样既消耗了线程上下文切换的时间,还浪费了内存。这些任务可能只需要一条线程就能满足要求。假如某一任务需要执行较长的周期,线程池还可以自动增加线程,并在空闲时,销毁线程,释放占用的内存。
2、为什么不使用.Net默认的线程池
.Net默认的线程池(ThreadPool)是一个静态类,所以是没办法自己创建一个新的程序池的。默认的线程池与应用程序域(AppDomain)挂钩,一个AppDomain只有一个线程池。假如在线程池中执行了一个周期较长的任务,一直占用着其中一个线程,可能就会影响到应用程序域中的其他程序的性能。例如,假如在Asp.Net的线程池中执行一个周期较长的任务,就会影响请求的并发处理能力(线程池默认有个最大线程数)。
3、SmartThreadPool特性和优点
SmartThreadPool特性如下:

  • 池中的线程数量会根据负载自动增减
  • 任务异步执行后可以返回值
  • 处于任务队列中未执行的任务可以取消
  • 回调函数可以等待多个任务都执行完成后再触发
  • 任务可以有优先级(priority)
  • 任务可以分组
  • 支持泛型Action 和 Func
  • 有性能监测机制
    4、实列使用
    4.1、实例化时参数解释
    STPStartInfo stp = new STPStartInfo();
    stp.CallToPostExecute = CallToPostExecute.Always;
    stp.DisposeOfStateObjects = true;
    stp.IdleTimeout = 300;//300s
    stp.MaxWorkerThreads = 15;
    stp.FillStateWithArgs = true;
    stp.MinWorkerThreads = 5;
    stp.PostExecuteWorkItemCallback = delegate(IWorkItemResult wir)
    {
    MessageBox.Show("ok" + wir.Result); };
    stp.StartSuspended = true;
    }
    m_hThreadPool = new SmartThreadPool(stp);
    4.2、SmartThreadPool的部分解释
    SmartThreadPool smartThreadPool = new SmartThreadPool();
    smartThreadPool.Cancel();
    smartThreadPool.Cancel(true);
    smartThreadPool.Concurrency = 25;
    smartThreadPool.CreateWorkItemsGroup(3);
    smartThreadPool.Join(new Action[] { new Action(Test) });
    smartThreadPool.MaxThreads = 25;
    smartThreadPool.MinThreads = 0;
    smartThreadPool.Name = "StartThreadPool";
    smartThreadPool.OnIdle += new WorkItemsGroupIdleHandler(smartThreadPool_OnIdle);
    smartThreadPool.OnThreadInitialization += new ThreadInitializationHandler(smartThreadPool_OnThreadInitialization);
    smartThreadPool.OnThreadTermination += new ThreadTerminationHandler(smartThreadPool_OnThreadTermination);
    smartThreadPool.Pipe

4.3、 最简单的使用方法
// 创建一个线程池
SmartThreadPool smartThreadPool = new SmartThreadPool();
// 执行任务
smartThreadPool.QueueWorkItem(() =>
{
Console.WriteLine("Hello World!");
});
带返回值的任务:
// 创建一个线程池
SmartThreadPool smartThreadPool = new SmartThreadPool();
// 执行任务
var result = smartThreadPool.QueueWorkItem(() =>
{
var sum = 0;
for (var i = 0; i < 10; i++)
sum += i;

return sum;

});

// 输出计算结果
Console.WriteLine(result.Result);
等待多个任务执行完成:
// 创建一个线程池
SmartThreadPool smartThreadPool = new SmartThreadPool();
// 执行任务
var result1 = smartThreadPool.QueueWorkItem(() =>
{
//模拟计算较长时间
Thread.Sleep(5000);
return 3;
});
var result2 = smartThreadPool.QueueWorkItem(() =>
{
//模拟计算较长时间
Thread.Sleep(3000);
return 5;
});
bool success = SmartThreadPool.WaitAll(
new IWorkItemResult[] { result1, result2 });
if (success)
{
// 输出结果
Console.WriteLine(result1.Result);
Console.WriteLine(result2.Result);
}

标签:线程,C#,任务,stp,SmartThreadPool,new,smartThreadPool
From: https://www.cnblogs.com/qiutian-hao/p/18079982

相关文章

  • 整块代码自动生成、智能括号匹配……CodeGeeX编程提效,功能再升级!
    CodeGeeX插件功能持续打磨,希望成为开发者更高效的智能编程工具,提高开发速度和代码质量。今天介绍VSCode中最新的v2.4.0版本插件新功能,让你在编写代码时更加得心应手。一、新增block代码块生成的设置CodeGeeX插件中,以往针对代码生成的行数,只有Automatic和Linebyline两种模式。......
  • Editing Factual Knowledge and Explanatory Ability of Medical Large Language Mode
    本文是LLM系列文章,针对《EditingFactualKnowledgeandExplanatoryAbilityofMedicalLargeLanguageModels》的翻译。医学大语言模型的编辑事实知识与解释能力摘要1引言2相关工作3方法4实验5结论6局限性摘要模型编辑旨在精确地修改大型语言模型......
  • Jailbreaking Large Language Models in Few Queries via Disguise and Reconstructio
    本文是LLM系列文章,针对《MakingThemAskandAnswer:JailbreakingLargeLanguageModelsinFewQueriesviaDisguiseandReconstruction》的翻译。让他们问答:通过伪装和重建在少数查询中打破大型语言模型的牢笼摘要1引言2背景和问题陈述3LLM微调中的安全偏......
  • 另一种方式启动tomcat catalina.sh run 前台 catalina.sh start 后台
    如果您想使用catalina.sh来启动Tomcat服务器,您可以按照以下步骤进行:打开终端。导航到Tomcat的bin目录,例如:bashcd/path/to/tomcat/bin使用以下命令之一来启动Tomcat服务器:使用catalina.shrun命令来在前台启动Tomcat。这意味着Tomcat将直接在您的终端窗口中运行,......
  • 多线程系列(二十一) -ForkJoin使用详解
    一、摘要从JDK1.7开始,引入了一种新的Fork/Join线程池框架,它可以把一个大任务拆成多个小任务并行执行,最后汇总执行结果。比如当前要计算一个数组的和,最简单的办法就是用一个循环在一个线程中完成,但是当数组特别大的时候,这种执行效率比较差,例如下面的示例代码。longsum=0......
  • CF933-Div3 大致思路+题解
    A-RudolfandtheTicket纯水题暴力枚举直接过$code$#include<bits/stdc++.h>#definefo(x,y,z)for(int(x)=(y);(x)<=(z);(x)++)#definefu(x,y,z)for(int(x)=(y);(x)>=(z);(x)--)inlineintqr(){ charch=getchar();intx=0,f=1; for(;ch<'0......
  • Disentangled Contrastive Collaborative Filtering 论文阅读笔记
    DisentangledContrastiveCollaborativeFiltering论文阅读笔记Abstract存在的问题:大多数现有的基于gcl的CF模型仍然受到限制,因为忽略了用户-项目交互行为往往是由各种潜在意图因素驱动的(例如,为了家庭聚会购物,首选颜色或产品品牌)引入的非自适应增强技术容易受到噪声信息的......
  • C#异步编程:原理与实践
    一、引言在现代应用程序开发中,尤其是在涉及I/O操作(如网络请求、文件读写等)时,异步编程成为了提高性能和用户体验的关键技术。C#作为.NET框架下的主流开发语言,提供了强大的异步编程支持,通过async/await关键字,可以让开发者以同步的方式编写异步代码,极大地简化了异步编程的复杂性。本......
  • vue页面纯前端导出excel表格(多级表头,exceljs)
    查找对比因为是第一次实现这样的功能,先在网上进行了查找,发现了三种比较常用的方法:1.安装file-saverxlsxscript-loader如果想设置表格样式的话,需要同时安装依赖xlsx-style,通常情况下安装此依赖会报错,需要进行修改;2.安装vue-json-excel这个插件看起来比较好上手,但是好像只......
  • 已解决org.apache.zookeeper.KeeperException.SessionExpiredException异常的正确解决
    已解决org.apache.zookeeper.KeeperException.SessionExpiredException异常的正确解决方法,亲测有效!!!目录问题分析报错原因解决思路解决方法总结 博主v:XiaoMing_JavaApacheZooKeeper是一个开源的分布式协调服务,它被广泛用于维护配置信息、命名注册、提供分布式同步......