c# 多线程控制最大线程数
假定现在存在一个对象数组,需要对数组中的每个对象进行分析,但是分析存在较长的耗时处理,那么单线程处理就显得很局限了,这里就采用多线程处理,但是多线程要控制最大线程数量。
线程与线程之间有会争取 CPU 资源,这就会导致上下文切换,上下文切换过多,必然增加线程的执行时间,影响了整体执行效率,所以设置过多的线程,会让cpu把更多的时间浪费在上下文切换中,效率反而降低了。
这里我们假定开15个线程。
class Program { static StringBuilder sb = new StringBuilder(); static int maxThreadNum = 15; static List<Task> tasks = new List<Task>(); static TaskFactory taskFactory = new TaskFactory(); static void Main(string[] args) { for (int i = 0; i < 100; i++) { var ii = i; tasks.Add(taskFactory.StartNew(() => { var s = Todoing(ii); sb.Append(s+","); })); if (tasks.Count >= maxThreadNum) { Task.WaitAny(tasks.ToArray()); tasks = tasks.Where(f => f.Status == TaskStatus.Running).ToList(); } } //循环完,等待剩余线程全部执行完成 Task.WaitAll(tasks.ToArray()); var sbstring = sb.ToString(); Console.WriteLine(sbstring); Console.WriteLine(sbstring.Split(",").Length); Console.ReadKey(); } static private string Todoing(int i) { Thread.Sleep(500); return i.ToString(); } }
执行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库