【中低階級】-執行緒Thread-使用-1

2023/06/11閱讀時間約 4 分鐘
  當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!使用的內容包括:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源、安全鎖(lock)、互斥鎖(mutex)、監測執行緒(monitor)、號誌(semaphore)、前景與背景執行緒。
使用引用地方就是寫程式的最上面,如下:
增加引用

一、建立與啟用執行緒

1.簡單建立與執行

  簡單先建立一個執行緒,這邊用「-」表主執行緒在執行,「*」表另一條執行緒執行。用下面這樣寫的方式程式執行的順序會是怎麼樣呢?我們用迴圈方式讓程式跑一下看結果,盡量迴圈次數多一點才足以瞭解執行順序狀況哦!
建立一條執行緒
建立一條執行緒-執行結果
可以見到它是用交錯的方式在執行直到程式內容做完。

2.傳入建構函式的委派

使用執行緒時會使用到委派,它有兩種模式:
(1)無帶參數:像上面的例子。
(2)有帶參數:看下面這個例子。
建立兩條執行緒(帶參數)
建立兩條執行緒(帶參數)-執行結果
這邊建立兩個執行緒,而這兩個執行緒都會做相同的事,但是執行緒是不同的,也可以比喻為不同人在做相同的事。

3.跨執行緒控制UI介面

當我們在執行緒中要直接控制UI介面的元件時,系統就會發出錯誤:
跨執行緒作業無效: 所使用的執行緒與建立控制項的執行緒不同。但在主程式中控制UI介面時則會正常執行。實際看一下它們的執行結果:

(1)執行緒控制UI與主程式控制UI差異

[執行緒直接操作UI介面]
執行緒直接控制 UI 錯誤
執行緒直接控制 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)相關內容唷~

為什麼會看到廣告
橙果杏
橙果杏
Hello~ Welcome to my blog~❤ 這邊會分享我在程式這條道路中的學習與成長, 過程中從而了解自己的不足,再學習。 希望透過分享的方式, 也讓正在學習程式的夥伴們一起學習, 我們一起加油吧~ 「彼此都會成為彼此之間的影響力」(´,,•ω•,,)♡ ❣
留言0
查看全部
發表第一個留言支持創作者!