zoukankan      html  css  js  c++  java
  • C# -- 使用线程池 ThreadPool 执行多线程任务

    C# -- 使用线程池 ThreadPool 执行多线程任务

    1. 使用线程池

        class Program
        {
            static void Main(string[] args)
            {
                WaitCallback wc1 = s =>{
                    Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
                    Stopwatch stw = new Stopwatch();
                    stw.Start();
                    long result = SumNumbers(10000000);
                    stw.Stop();
                    Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},",Thread.CurrentThread.ManagedThreadId,result,stw.ElapsedMilliseconds);
                };
                WaitCallback wc2 = s => {
                    Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
                    Stopwatch stw = new Stopwatch();
                    stw.Start();
                    long result = SumNumbers(10000000);
                    stw.Stop();
                    Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
                };
                WaitCallback wc3 = s => {
                    Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
                    Stopwatch stw = new Stopwatch();
                    stw.Start();
                    long result = SumNumbers(10000000);
                    stw.Stop();
                    Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
                };
    
                
                ThreadPool.QueueUserWorkItem(wc1);
                ThreadPool.QueueUserWorkItem(wc2);
                ThreadPool.QueueUserWorkItem(wc3);
    
                Console.ReadKey();
            }
    
            static long SumNumbers(int count)
            {
                long sum = 0;
                for (int i = 0; i < count; i++)
                {
                    sum += i;
                }
                Thread.Sleep(1000);
                return sum;
            }
        }

    执行结果:

    2. 等待线程池的线程执行

        class Program
        {
            static void Main(string[] args)
            {
                using (ManualResetEvent m1 = new ManualResetEvent(false))
                using (ManualResetEvent m2 = new ManualResetEvent(false))
                using (ManualResetEvent m3 = new ManualResetEvent(false))
                {
                    ThreadPool.QueueUserWorkItem(
                        s =>{
                            Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
                            Stopwatch stw = new Stopwatch();
                            stw.Start();
                            long result = SumNumbers(10000000);
                            stw.Stop();
                            m1.Set();
                            Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
                        });
    
                    ThreadPool.QueueUserWorkItem(
                        s =>{
                            Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
                            Stopwatch stw = new Stopwatch();
                            stw.Start();
                            long result = SumNumbers(10000000);
                            stw.Stop();
                            m2.Set();
                            Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
                        });
                    ThreadPool.QueueUserWorkItem(
                        s =>{
                            Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
                            Stopwatch stw = new Stopwatch();
                            stw.Start();
                            long result = SumNumbers(10000000);
                            stw.Stop();
                            m3.Set();
                            Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
                        });
    
                    //等待线程池的线程执行
                    m1.WaitOne();
                    m2.WaitOne();
                    m3.WaitOne();
                    Console.WriteLine("所有线程执行完成");
    
                }
    
                Console.ReadKey();
            }
    
            static long SumNumbers(int count)
            {
                long sum = 0;
                for (int i = 0; i < count; i++)
                {
                    sum += i;
                }
                Thread.Sleep(3000);
                return sum;
            }
        }

    执行结果:

  • 相关阅读:
    韦德螺旋: 这真是一个螺旋吗?
    山上你能看到什么动物?
    你能够30秒内一字不差的念完它吗? 注意, 是读“颜色”, 不是让你识字.
    路透斯沃德的不可能的三角形
    换个角度, 青蛙也许就是白马王子
    这是一张很有趣的图片, 通常女性会先看到月亮, 男性会先看到人脸. 如果相反, 表示你体内的异性荷尔蒙偏高哦!
    亲吻的情侣幻觉: 这幅虚幻的亲吻由美国艺术家杰里•唐恩创作.
    PostgreSQL的 initdb 源代码分析之七
    PostgreSQL的initdb 源代码分析之六
    PostgreSQL的initdb 源代码分析之五
  • 原文地址:https://www.cnblogs.com/ChengWenHao/p/CSharpThreadPool.html
Copyright © 2011-2022 走看看