當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!使用的內容包括:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源、安全鎖(lock)、互斥鎖(mutex)、監測執行緒(monitor)、號誌(semaphore)、前景與背景執行緒。
使用引用地方就是寫程式的最上面,如下:
一、建立與啟用執行緒
1.簡單建立與執行
簡單先建立一個執行緒,這邊用「-」表主執行緒在執行,「*」表另一條執行緒執行。用下面這樣寫的方式程式執行的順序會是怎麼樣呢?我們用迴圈方式讓程式跑一下看結果,盡量迴圈次數多一點才足以瞭解執行順序狀況哦!
可以見到它是用交錯的方式在執行直到程式內容做完。
2.傳入建構函式的委派
使用執行緒時會使用到委派,它有兩種模式:
(1)無帶參數:像上面的例子。
(2)有帶參數:看下面這個例子。
這邊建立兩個執行緒,而這兩個執行緒都會做相同的事,但是執行緒是不同的,也可以比喻為不同人在做相同的事。
3.跨執行緒控制UI介面
當我們在執行緒中要直接控制UI介面的元件時,系統就會發出錯誤:
跨執行緒作業無效: 所使用的執行緒與建立控制項的執行緒不同。但在主程式中控制UI介面時則會正常執行。實際看一下它們的執行結果:
(1)執行緒控制UI與主程式控制UI差異
[執行緒直接操作UI介面]
[主程式直接控制 UI ]
這下該怎麼辦呢?
(2)執行緒控制UI方法
A.設定元件的屬性
多新增一行更改屬性的值,也就是
CheckForIllegalCrossThreadCalls = false;
這個屬性意思就是:「是否要攔截不該存取,卻要存取控制項」。但是這會不穩定,有可能會有不可預期的錯誤,因此要
使用的時候要三思!!!
B.使用委派(delegate)
使用委派的方法是較穩妥的一個方式,另外還有一個使用BackGroundWork可以看下面所列的參考資料。
4.等待或暫停時間執行緒 A.等待
當我們想要讓執行緒先做完再做主程式的事,那麼就使用Join()的方法,大家可以試試看。
B.暫停
當我們想要讓執行緒稍等一下也就是暫停執行,那麼就可以使用Sleep()這個方法(Sleep的時間單位為毫秒)
5.共享資源
當我們主程式在使用執行緒時,對於宣告為全域的變數在執行緒的函式中式可以直接使用的,我們用累加的方式來看一下不同執行緒產生的結果。(這邊共享資源為全域變數的count)
這邊t5、t6兩個執行緒都會去執行Thread5這個函式,我們給予暫停時間來記錄一下兩個執行緒執行的結果,可看出有兩條執行緒真的有執行Thread5這個函式,第一條count+1(也就是0+1=1),第二條count+1(也就是1+1=2)。
那麼假若在主程式中t5、t6兩個執行緒的暫停時間都設為一樣時,結果就只會出現1個(也就是=2),因為兩條執行緒並行執行了。(這邊我就不放圖了,大家可以自己操作看看)
下次分享安全鎖(lock)相關內容,包括mutex、monitor等等,也會有號誌(semaphore)相關內容唷~