C# Thread應用(一)
Thread的翻譯就叫「線」
我最愛就是比喻工人:
主程式很忙的,有些事不方便叫主程式做
所以我叫了個工人(Thread)
寫個蓋房子的方法,跟他說要做的是這個方法(ThreadStart)
另外,當房子蓋到一半,我希望你清理環境,接著再回來繼續蓋 (Join)
程式碼:
有的時候,我想做大量的運算:
可是,這樣會造成主程式卡住…因為一直在算
這時就可以叫Thread 來幫助執行
不過還有一個問題
label2是在主程式中的元件
而Thread又想直接改label2.Text
這樣有點不妥,用比喻來說:
主程式=董事長的辦公室
label2=董事長的計畫書
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();
}
}



留言
張貼留言