C# 線程處理
內容
使用線程處理
如何:建立和終止線程
如何:使用線程池
如何:對製造者線程和使用者線程進行同步
使用線程池
通過 ThreadPool 類使用
下面的樣本使用 .NET Framework 線程池計算 20 和 40 之間的十個數的 Fibonacci
結果。每個 Fibonacci
結果都由 Fibonacci
類表示,該類提供一種名為 ThreadPoolCallback
的方法來執行此計算。將建立表示每個 Fibonacci 值的對象,ThreadPoolCallback
方法將傳遞給 QueueUserWorkItem,它分配池中的一個可用線程來執行此方法。
由於為每個 Fibonacci
對象都提供了一個半隨機值來進行計算,而且十個線程都將競爭處理器時間,因此無法提前知道十個結果全部計算出來所需的時間。因此在構造期間為每個 Fibonacci
對象傳遞 ManualResetEvent 類的一個執行個體。當計算完成時,每個對象都通知提供的事件對象,使主線程用 WaitAll 阻止執行,直到十個 Fibonacci
對象全部計算出了結果。然後 Main
方法將顯示每個 Fibonacci
結果。
using System;using System.Threading;public class Fibonacci{ public Fibonacci(int n, ManualResetEvent doneEvent) { _n = n; _doneEvent = doneEvent; } // Wrapper method for use with thread pool. public void ThreadPoolCallback(Object threadContext) { int threadIndex = (int)threadContext; Console.WriteLine("thread {0} started...", threadIndex); _fibOfN = Calculate(_n); Console.WriteLine("thread {0} result calculated...", threadIndex); _doneEvent.Set(); } // Recursive method that calculates the Nth Fibonacci number. public int Calculate(int n) { if (n <= 1) { return n; } return Calculate(n - 1) + Calculate(n - 2); } public int N { get { return _n; } } private int _n; public int FibOfN { get { return _fibOfN; } } private int _fibOfN; private ManualResetEvent _doneEvent;}public class ThreadPoolExample{ static void Main() { const int FibonacciCalculations = 10; // One event is used for each Fibonacci object ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations]; Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations]; Random r = new Random(); // Configure and launch threads using ThreadPool: Console.WriteLine("launching {0} tasks...", FibonacciCalculations); for (int i = 0; i < FibonacciCalculations; i++) { doneEvents[i] = new ManualResetEvent(false); Fibonacci f = new Fibonacci(r.Next(20, 40), doneEvents[i]); fibArray[i] = f; ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i); } // Wait for all threads in pool to calculation... WaitHandle.WaitAll(doneEvents); Console.WriteLine("All calculations are complete."); // Display the results... for (int i = 0; i < FibonacciCalculations; i++) { Fibonacci f = fibArray[i]; Console.WriteLine("Fibonacci({0}) = {1}", f.N, f.FibOfN); } }}