1. 程式人生 > 其它 >C#Fibonacci多執行緒測試

C#Fibonacci多執行緒測試

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);
            }
        }

    }
}