本文不是講多線程,也不是講在多線程中使用工作流程什麼的,而是用設計多線程的思路講一下工作流程的工作思想。
NET中的System.Threading.Thread的例子很簡單,以至於許多程式員只學了幾個小時就以為自已會多線程開發的。沒有直正寫過多線程的人是無法體會多線程是多麼的…..
很多人上手WF總是覺得一些功能的實現有些怪,特另是宿主與執行個體或執行個體與執行個體通訊這部分。
我用多線程的思路講一下:
(註:如果你對Abort與Interrupt方法非常瞭解,本文對你來說沒有什麼技術上的意義)
Abort,強行終止線程
class 要參與多線程的類 { public void 方法() { int i = 0; try { while (i<3000) { i = i + 1; Console.WriteLine(i); } } catch (ThreadInterruptedException e) { Console.WriteLine("由Interrupt方法引發的: " + e.Message);} } } |
Thread 線程對象= new Thread((new 要參與多線程的類()).方法); 線程對象.Start(); System.Threading.Thread.Sleep(600); //一毫秒在多線程中也是有其作用的,因為他表示一次停頓 線程對象.Abort(); Console.WriteLine("主線程完成"); Console.Read(); |
線程對象.Abort();方法會硬生生的將線程終止,如while中的i迴圈到234就被終止了 這樣很不好,特別是在對資操作時。而且無法捕獲到異常 |
Interrupt,當線程不再做任何有意義的工作時,終止線程
class 要參與多線程的類 { public void 方法() { int i = 0; try { while (i<5000) { i = i + 1; Console.WriteLine(i); } } catch (ThreadInterruptedException e) { Console.WriteLine("由Interrupt方法引發的: " + e.Message);} } } |
Thread 線程對象= new Thread((new 要參與多線程的類()).方法); 線程對象.Start(); System.Threading.Thread.Sleep(600); //一毫秒在多線程中也是有其作用的,因為他表示一次停頓 線程對象.Interrupt(); Console.WriteLine("主線程完成"); Console.Read(); |
不會終止上例,因為上例的線程從來都沒進入過WaitJoinSleep狀態,當然也不會產生異常 |
class 要參與多線程的類 { public void 方法() { int i = 0; try { while (i<5000) { System.Threading.Thread.Sleep(1); i = i + 1; Console.WriteLine(i); } } catch (ThreadInterruptedException e) { Console.WriteLine("由Interrupt方法引發的: " + e.Message);} } } |
Thread 線程對象= new Thread((new 要參與多線程的類()).方法); 線程對象.Start(); System.Threading.Thread.Sleep(600); //一毫秒在多線程中也是有其作用的,因為他表示一次停頓 線程對象.Interrupt(); Console.WriteLine("主線程完成"); Console.Read(); |
由於添加了 System.Threading.Thread.Sleep(1);,線程會進入WaitJoinSleep狀態,線程對象.Interrupt()生效,線程終止,可以捕獲到異常,並可以異常中作一些收尾工作 |
還有這個
class 要參與多線程的類 { public void 方法() { int i = 0; try { while (i<5000) { i = i + 1; Console.WriteLine(i); } System.Threading.AutoResetEvent w = new AutoResetEvent(false); w.WaitOne(); Console.WriteLine("---"); } catch (ThreadInterruptedException e) { Console.WriteLine("由Interrupt方法引發的: " + e.Message);} } } |
AutoResetEvent與Thread.Sleep對Interrupt()方法性質一樣 |
所以我在設計要參與多線程的方法時會類似可能會這樣
Void 方法() { 邏輯代碼單元1; System.Threading.Thread.Sleep(1) 邏輯代碼單元2; System.Threading.AutoResetEvent w = new AutoResetEvent(false); w.WaitOne(); 邏輯代碼單元3; System.Threading.Thread.Sleep(1) } |
我要與另一個線程正在使用的對象通訊時,我會讓那個線程被一個w.WaitOne()阻塞,當通訊完成時w.Set(),讓那個線程繼續。
當然還會有lock的技巧,這裡就不說了。
我要說的是
Thread.Sleep,AutoResetEvent,以及我所說的通訊方式,
在工作流程是對應的是什麼…….大家自已想吧,
你要想從一條流動的河中取出一瓢水,看完後想再將其放回源除,讓時間對這條河暫停吧