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(); } }
留言
張貼留言