close

使用多執行緒的簡單測試,用lambda寫法配合迴圈去指派工作 並用WaitHandle.WaitAll 等待全部子執行緒完成後,再繼續往下執行程式

完整程式載點 https://github.com/courage00/Multithreaded-Component

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        public class Calculator //自定義calss
        {
            public string Name { get; set; }
            public long Result { get; set; }

            private AutoResetEvent _WaitHandle;
            public AutoResetEvent WaitHandle
            {
                get { return _WaitHandle; }
                set { _WaitHandle = value; }
            }
        }
        static WaitHandle[] waitHandles = null;
        static void Main(string[] args)
        {
            Program oProgram = new Program();
            oProgram.Start();

            Console.WriteLine("重回主執行緒");
            Console.WriteLine("ggggggg");
            Console.ReadKey();
           // Console.ReadLine();
        }
        private void Start()
        {
            //設立迴圈加入想要執行緒數量
            List<Calculator> calculator = new List<Calculator>() { };
            for (int t = 0; t < 3; t++)
            {
                calculator.Add (new Calculator { Result = 0, WaitHandle = new AutoResetEvent(false), Name = "NO."+t });
            }
            //把子執行緒總數丟給waitHandles
            waitHandles = new WaitHandle[calculator.Count];
            for (int i = 0; i < calculator.Count; i++)
            {
                waitHandles[i] = calculator[i].WaitHandle;
            }
            //建置子執行緒 並直接用lambda expression
            for (int i = 1; i <= 3; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(
                    o =>                
                    {
                     
                        Calculator calculator1 = (Calculator)o;
                      
                        Console.WriteLine("{0} 進入子執行緒", calculator1.Name);
                        Thread.Sleep(1000);
                        AutoResetEvent reset = calculator1.WaitHandle; 
                        Console.WriteLine("a");
                        Console.WriteLine("b");
                        Console.WriteLine("c");
                        Console.WriteLine("d");
                        Thread.Sleep(1000);
                        reset.Set();
 
                    }), calculator[i-1]);
                    
            };
            if (waitHandles != null) 
            {
                WaitHandle.WaitAll(waitHandles);
            }
            
            Console.WriteLine(waitHandles.Length);
            Console.WriteLine("子執行緒over");
            


        }
    }
}
 

arrow
arrow
    創作者介紹
    創作者 Wood 的頭像
    Wood

    學習雜記

    Wood 發表在 痞客邦 留言(0) 人氣()