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     }

執行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM