C#Fibonacci多執行緒測試
阿新 • • 發佈:2022-03-13
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace _100tempTest { /// <summary> /// 黃金分割數列:1,1,2,3,5,8,13,21... /// </summary> class Fibonacci_斐波那契執行緒池測試 { /// <summary> /// 輸入測試 /// </summary> private int _n; private ManualResetEvent _doneEvent; /// <summary> /// 計算結果 /// </summary> private int _fiboFN; /// <summary> /// 開始時間 /// </summary> private DateTime _startTime; /// <summary> /// 結束時間 /// </summary> private DateTime _endTime; public int N { get { return _n; } } public int FiboFN { get { return _fiboFN; } } public DateTime StartTime { get { return _startTime; } } public DateTime EndTime { get { return _endTime; } } public Fibonacci_斐波那契執行緒池測試(int n,ManualResetEvent doneEvent) { this._n = n; this._doneEvent = doneEvent; } public int Recursion_遞迴(int n) { if (n < 3) { return 1; } else { return Recursion_遞迴(n-1)+ Recursion_遞迴(n - 2); } } public void ThreadPoolCallback(object threadContext) { int threadIndex = (int)threadContext; //開始 _startTime = DateTime.Now; _fiboFN = Recursion_遞迴(_n); //結束 _endTime = DateTime.Now; _doneEvent.Set(); } } public class TestClass { public void Test() { const int FibonacciCalculations = 5;//定義5個斐波那契數 ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations]; Fibonacci_斐波那契執行緒池測試[] fibonacciArray = new Fibonacci_斐波那契執行緒池測試[FibonacciCalculations]; Random random = new Random(); for (int i = 0; i < FibonacciCalculations; i++) { doneEvents[i] = new ManualResetEvent(false); Fibonacci_斐波那契執行緒池測試 fibonacci_ = new Fibonacci_斐波那契執行緒池測試(random.Next(30,42), doneEvents[i]); fibonacciArray[i] = fibonacci_; ThreadPool.QueueUserWorkItem(fibonacci_.ThreadPoolCallback,i); } //等待全部結束方法一: //WaitHandle.WaitAll(doneEvents);//報錯不支援一個 STA 執行緒上針對多個控制代碼的 WaitAll,是因為預設main函式上的[STAThread]為單執行緒程式,註釋即可。 foreach (var item in doneEvents)//等待全部結束方法二 { item.WaitOne(); } List<int> fbArray = new List<int>(); for (int i = 0; i < FibonacciCalculations; i++) { fbArray.Add(fibonacciArray[i].FiboFN); } } } }