C# 多線程處理相關說明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem

  class TestThread
    {
        
        static void Main()
        {
            //使用WaitHandle靜態方法阻止一個線程,直到一個或多個同步對象接收到信號
            WaitHandle[] waitHandles = new WaitHandle[] 
            {
            new ManualResetEvent(false),
            new ManualResetEvent(false)
            };

            WaitCallback waitCallback = new WaitCallback(MyThreadWork);

            WaitCallback waitCallback2 = new WaitCallback(MyThreadWork2);     // 增長線程工做類型

            ThreadPool.QueueUserWorkItem(waitCallback, "第一個線程");
            ThreadPool.QueueUserWorkItem(waitCallback, "第二個線程");

            MyState myState = new MyState("第三個線程", 100, waitHandles[0]); // 增長自定義的線程參數類型

            ThreadPool.QueueUserWorkItem(waitCallback2, myState);
            ThreadPool.QueueUserWorkItem(waitCallback2, new MyState("第四個線程", 2, waitHandles[1]));

            WaitHandle.WaitAll(waitHandles);

            Console.WriteLine("MyState 的 Number 值爲: {0}", myState.Number);    // 讀取線程改變後的 MyState
        }

        public static void MyThreadWork(object state)
        {
            Console.WriteLine("MyThreadWork 開始啓動 …… {0}", (string)state);
            Thread.Sleep(1000);
            Console.WriteLine("運行結束…… {0}", (string)state);
        }

        // use MyState class 
        public static void MyThreadWork2(object state)
        {
            MyState myState = ((MyState)state);
            Console.WriteLine("MyThreadWork2 開始啓動…… {0},{1}", ((MyState)state).Info, ((MyState)state).Number);
            Thread.Sleep(1000);
            ((MyState)state).Number += 1;      // 將 state的 Number 加 1
            Console.WriteLine("運行結束…… {0},{1}", ((MyState)state).Info, ((MyState)state).Number);
            ((ManualResetEvent)myState.DoneEvent).Set();
        }

    }

    public class MyState
    {
        private string info;
        private int number;
        private WaitHandle _doneEvent;


        public MyState(string info, int number, WaitHandle doneEvent)
        {
            this.info = info;
            this.number = number;
            this._doneEvent = doneEvent;
        }

        public string Info
        {
            get
            {
                return this.info;
            }
            set
            {
                this.info = value;
            }
        }

        public WaitHandle DoneEvent
        {
            get
            {
                return this._doneEvent;
            }
        }

        public int Number
        {
            get
            {
                return this.number;
            }
            set
            {
                this.number = value;
            }
        }
    }

 

程序運行結果截圖

相關文章
相關標籤/搜索