2013年4月18日 星期四

Threading多執行序技術

多執行續可用於
分別各自執行指定的程式區塊
每個程式區塊,將執行完畢後各自輸出結果
而不受干擾
使用命名空間
using System.Threading

出處參考,C#隨性筆記


先來看一下 下面範例

        private void button2_Click(object sender, EventArgs e)
        {    //利用for迴圈來產生5個執行緒
            for (int i = 1; i <= 5; i++)
            {
                //建立執行緒
                //並建立執行緒 subthread
                //執行的目的方法指定為 work
                Thread subThread = new Thread(new ThreadStart(work));
                //這一行特別講解上行結構
                //上面建立Thread物件並委派 縮寫法
                //如果方開建立,則如下
                //先建立ThreadStart 並指定方法work
                //
                //ThreadStart subThreadStart=new ThreadStart(work)
                //在建立Thread
                //
                //Thread subThread=new Thread(subThreadStart);
                subThread.Name = "SubThread" + i.ToString();//設定i=1~5名稱
                subThread.Start();//執行Start方法,Start會呼叫 work
                //分別呼叫5次,這5次分別執行 不收干擾
            }
        }
        static void work()
        {
            //遇到SubThread2延遲15秒
            if (Thread.CurrentThread.Name == "SubThread2")
            {
                Thread.Sleep(15000);//等待15秒
                MessageBox.Show("15秒到了");
            }
            //遇到SubThread1延遲10秒
            else if (Thread.CurrentThread.Name == "SubThread1")
            {
                Thread.Sleep(10000);//等待10秒
                MessageBox.Show("10秒到了");
            }
            MessageBox.Show("Thread State;" + Thread.CurrentThread.ThreadState.ToString());
            MessageBox.Show("目前執行Thread Name:" + Thread.CurrentThread.Name);
            MessageBox.Show("Thread ID:" + Thread.CurrentThread.ManagedThreadId);
        }



上面呼叫SubThread1,SubThread2
將進入IF判斷 如果是 將延遲數秒後才執行
經由程式執行時~
3.4.5將 優先SHOW出
1.2 將晚10秒,15秒SHOW出
可以證明 這兩程序 將各自讀秒 獨立完成個別程式中的程式區塊


如果要帶入參數??
不可以使用ThreadStart
必須使用ParameterizedThreadStart
而副程式中的參數 必須要是 object
再轉換成 各種形式
下面範例將 套入參數部分

private void button3_Click(object sender, EventArgs e)
        {
            for (int I = 1; I <= 5; I++)
            {
                //帶入參數使用ParameterizedThreadStart副程式標籤 必須是object
                Thread GO = new Thread(new ParameterizedThreadStart(TTTT));
                GO.Name = "myname=" + I.ToString();
                GO.Start("No" + I.ToString());////呼叫TTTT並帶入摻數NO1~NO5
            }
        }
        static void TTTT(object R)//只能是object
        {
            string son = (string)R;//再將object轉成要的型態
            if (son == null)
            {
                MessageBox.Show("轉型失敗");//如果再轉型有問題 立即顯示
            }
            if (Thread.CurrentThread.Name == "myname=2")
            {
                Thread.Sleep(10000);//如果是myname=2 讓他等10秒在SHOW出
            }
            MessageBox.Show("傳入的參數R=" + R.ToString());
            MessageBox.Show("Thread.State=" + Thread.CurrentThread.ThreadState.ToString());
            MessageBox.Show("Thread.Name=" + Thread.CurrentThread.Name);
            MessageBox.Show("Thread.ID=" + Thread.CurrentThread.ManagedThreadId);
        }

沒有留言:

張貼留言