经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C# -- 使用线程池 ThreadPool 执行多线程任务
来源:cnblogs  作者:在代码的世界里游走  时间:2018/12/20 9:45:02  对本文有异议

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. ThreadPool.QueueUserWorkItem(wc1);
  30. ThreadPool.QueueUserWorkItem(wc2);
  31. ThreadPool.QueueUserWorkItem(wc3);
  32. Console.ReadKey();
  33. }
  34. static long SumNumbers(int count)
  35. {
  36. long sum = 0;
  37. for (int i = 0; i < count; i++)
  38. {
  39. sum += i;
  40. }
  41. Thread.Sleep(1000);
  42. return sum;
  43. }
  44. }

执行结果:

 

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. ThreadPool.QueueUserWorkItem(
  20. s =>{
  21. Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
  22. Stopwatch stw = new Stopwatch();
  23. stw.Start();
  24. long result = SumNumbers(10000000);
  25. stw.Stop();
  26. m2.Set();
  27. Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
  28. });
  29. ThreadPool.QueueUserWorkItem(
  30. s =>{
  31. Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
  32. Stopwatch stw = new Stopwatch();
  33. stw.Start();
  34. long result = SumNumbers(10000000);
  35. stw.Stop();
  36. m3.Set();
  37. Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
  38. });
  39. //等待线程池的线程执行
  40. m1.WaitOne();
  41. m2.WaitOne();
  42. m3.WaitOne();
  43. Console.WriteLine("所有线程执行完成");
  44. }
  45. Console.ReadKey();
  46. }
  47. static long SumNumbers(int count)
  48. {
  49. long sum = 0;
  50. for (int i = 0; i < count; i++)
  51. {
  52. sum += i;
  53. }
  54. Thread.Sleep(3000);
  55. return sum;
  56. }
  57. }

执行结果:

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号