C# Thread應用(一)

Thread的翻譯就叫「線」

我最愛就是比喻工人:
主程式很忙的,有些事不方便叫主程式做
所以我叫了個工人(Thread)
寫個蓋房子的方法,跟他說要做的是這個方法(ThreadStart)
另外,當房子蓋到一半,我希望你清理環境,接著再回來繼續蓋 (Join)






程式碼:


private void button1_Click(object sender, EventArgs e)
{   
    Thread t1 = new Thread(new ThreadStart(MyThreadRun1));
    t1.Name = "蓋房子嘍";                        
    t1.Start();
}

//執行緒的工作內容
private void MyThreadRun1()
{
    for (int i = 0; i <= 100; i+=10)
    {
        Console.WriteLine(Thread.CurrentThread.Name + ":" + i+"%");
        if (i == 50)
        {
            Thread t2 = new Thread(new ThreadStart(MyThreadRun2));
            t2.Name = "打掃環境";
            t2.Start();
            t2.Join();
        }
    }
}
        
private void MyThreadRun2()
{
    for (int i = 0; i <= 100; i+=10)
    {
        Console.WriteLine(Thread.CurrentThread.Name + ":" + i+"%");        
    }
}


有的時候,我想做大量的運算:

private void button3_Click(object sender, EventArgs e)
{
    long sum = 0;
    for (int i = 1; i <= 2100000000; i++)
    {
        sum += i;
    }

    label2.Text = sum.ToString();
}


可是,這樣會造成主程式卡住…因為一直在算
這時就可以叫Thread 來幫助執行
不過還有一個問題
label2是在主程式中的元件
而Thread又想直接改label2.Text
這樣有點不妥,用比喻來說:

主程式=董事長的辦公室
label2=董事長的計畫書
Thread=工人

工人事情做完後,應該不行直接進到董事長的辦公室去改董事長的計畫書吧?
所以,這時需要一個秘書建立之間的通信橋梁!!

流程大概如下:
一、董事長叫工人做事
二、工人去做完後,委派給秘書
三、秘書再去請教董事長是否有空
四、若董事長有空,秘書再把成品交給董事長
五、由董事長去寫上計畫書中



程式碼:

private void button4_Click(object sender, EventArgs e)
{
    ThreadStart ts = new ThreadStart(MyCalcRun);
    Thread tt = new Thread(ts);
    Console.WriteLine("董事長叫工人做事!");
    tt.Start();
}

private void MyCalcRun()
{
    //做事的內容
    long sum = 0;
    for (int i = 1; i <= 2100000000; i++)            
        sum += i;
    Console.WriteLine("做完後叫秘書!");
    RealThreadFinish(sum);

}

delegate void ThreadFinish(long answer);   //委派方法原型,也就是秘書

private void RealThreadFinish(long result) //實作委派方法的實際方法內容
{                                          //也就是秘書該怎麼做到通知老闆的方法
    if (this.label2.InvokeRequired)
    {
        ThreadFinish tf = new ThreadFinish(RealThreadFinish);           
        this.Invoke(tf, result);
                
    }
    else
    {
        Console.WriteLine("董事長有空寫上計畫書");
        label2.Text = result.ToString();    
    }
}



留言

熱門文章