C# -- 使用线程池 ThreadPool 执行多线程任务
1. 使用线程池
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 WaitCallback wc1 = s =>{ 6 Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId); 7 Stopwatch stw = new Stopwatch(); 8 stw.Start(); 9 long result = SumNumbers(10000000); 10 stw.Stop(); 11 Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},",Thread.CurrentThread.ManagedThreadId,result,stw.ElapsedMilliseconds); 12 }; 13 WaitCallback wc2 = s => { 14 Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId); 15 Stopwatch stw = new Stopwatch(); 16 stw.Start(); 17 long result = SumNumbers(10000000); 18 stw.Stop(); 19 Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds); 20 }; 21 WaitCallback wc3 = s => { 22 Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId); 23 Stopwatch stw = new Stopwatch(); 24 stw.Start(); 25 long result = SumNumbers(10000000); 26 stw.Stop(); 27 Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds); 28 }; 29 30 31 ThreadPool.QueueUserWorkItem(wc1); 32 ThreadPool.QueueUserWorkItem(wc2); 33 ThreadPool.QueueUserWorkItem(wc3); 34 35 Console.ReadKey(); 36 } 37 38 static long SumNumbers(int count) 39 { 40 long sum = 0; 41 for (int i = 0; i < count; i++) 42 { 43 sum += i; 44 } 45 Thread.Sleep(1000); 46 return sum; 47 } 48 }
执行结果:
2. 等待线程池的线程执行
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 using (ManualResetEvent m1 = new ManualResetEvent(false)) 6 using (ManualResetEvent m2 = new ManualResetEvent(false)) 7 using (ManualResetEvent m3 = new ManualResetEvent(false)) 8 { 9 ThreadPool.QueueUserWorkItem( 10 s =>{ 11 Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId); 12 Stopwatch stw = new Stopwatch(); 13 stw.Start(); 14 long result = SumNumbers(10000000); 15 stw.Stop(); 16 m1.Set(); 17 Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds); 18 }); 19 20 ThreadPool.QueueUserWorkItem( 21 s =>{ 22 Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId); 23 Stopwatch stw = new Stopwatch(); 24 stw.Start(); 25 long result = SumNumbers(10000000); 26 stw.Stop(); 27 m2.Set(); 28 Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds); 29 }); 30 ThreadPool.QueueUserWorkItem( 31 s =>{ 32 Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId); 33 Stopwatch stw = new Stopwatch(); 34 stw.Start(); 35 long result = SumNumbers(10000000); 36 stw.Stop(); 37 m3.Set(); 38 Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds); 39 }); 40 41 //等待线程池的线程执行 42 m1.WaitOne(); 43 m2.WaitOne(); 44 m3.WaitOne(); 45 Console.WriteLine("所有线程执行完成"); 46 47 } 48 49 Console.ReadKey(); 50 } 51 52 static long SumNumbers(int count) 53 { 54 long sum = 0; 55 for (int i = 0; i < count; i++) 56 { 57 sum += i; 58 } 59 Thread.Sleep(3000); 60 return sum; 61 } 62 }
执行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗