C#實現終止正在執行的線程(轉))


這篇文章主要介紹了C#實現終止正在執行的線程的方法,針對臨界資源等容易出現錯誤的地方進行了分析,並提出了改進方案與實例,需要的朋友可以參考下.

 

本文實例講述了C#實現終止正在執行的線程的實現方法,並針對一些容易出錯的地方進行了深入分析,具體方法如下:

一般來說,很多人都會使用Abort方法來終止線程,其實這種做法並不可取!如果你的線程正在操作臨界資源,很有可能會造成資源沒有正確釋放而出現死鎖問題。正確的做法應該是使用標記來終止線程的執行。

基本思路是:定義一個用於描述“停止”信號的變量,在整個程序啟動前,設置該變量為false。在線程中,循環判斷該變量是否已經被設置為true,如果沒有,則繼續執行,否則就退出循環並釋放資源,然后退出執行。當我們需要線程退出時,只要設置這個“停止”信號為true即可。
 
下面我們來看具體的操作步驟。

首先定義一個“停止”信號變量:

?
1
private volatile bool canStop = false ;

注意這里我們使用了volatile關鍵字,因為canStop變量將會被調用線程和執行線程同時使用,即在調用線程中初始化以及設置它的值,而在執行線程中判斷它的值。這樣做就告訴編譯器,這個canStop變量將被多個線程所使用,強制編譯器不對其狀態進行優化。如果有興趣可以上MSDN查看關於這個volatile關鍵字的更多解釋。此處同時也給canStop做了初始化。
 
現在我們看看線程的創建與執行的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
i = 0; 
// 使用匿名方法定義線程的執行體 
Thread thread = new Thread( 
delegate ( object param) 
   // 等待“停止”信號,如果沒有收到信號則執行 
   while (!canStop) 
  
     i++; 
     UpdateLabel(i); 
  
   // 此時已經收到停止信號,可以在此釋放資源並 
   // 初始化變量 
   canStop = false
}); 
  
thread.Start();

很簡單,在線程的執行體中反復判斷canStop變量是否為true,若是則立刻跳出while循環(停止變量的自加以及更新界面的操作),然后重新初始化canStop變量為false,以便於下次的使用。

https://blog.csdn.net/zhu2695/article/details/53464757


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM