C#實(shí)現(xiàn)終止正在執(zhí)行的線程
本文實(shí)例講述了C#實(shí)現(xiàn)終止正在執(zhí)行的線程的實(shí)現(xiàn)方法,并針對一些容易出錯的地方進(jìn)行了深入分析,具體方法如下:
一般來說,很多人都會使用Abort方法來終止線程,其實(shí)這種做法并不可??!如果你的線程正在操作臨界資源,很有可能會造成資源沒有正確釋放而出現(xiàn)死鎖問題。正確的做法應(yīng)該是使用標(biāo)記來終止線程的執(zhí)行。
基本思路是:定義一個用于描述“停止”信號的變量,在整個程序啟動前,設(shè)置該變量為false。在線程中,循環(huán)判斷該變量是否已經(jīng)被設(shè)置為true,如果沒有,則繼續(xù)執(zhí)行,否則就退出循環(huán)并釋放資源,然后退出執(zhí)行。當(dāng)我們需要線程退出時,只要設(shè)置這個“停止”信號為true即可。
下面我們來看具體的操作步驟。
首先定義一個“停止”信號變量:
private volatile bool canStop = false;
注意這里我們使用了volatile關(guān)鍵字,因?yàn)閏anStop變量將會被調(diào)用線程和執(zhí)行線程同時使用,即在調(diào)用線程中初始化以及設(shè)置它的值,而在執(zhí)行線程中判斷它的值。這樣做就告訴編譯器,這個canStop變量將被多個線程所使用,強(qiáng)制編譯器不對其狀態(tài)進(jìn)行優(yōu)化。如果有興趣可以上MSDN查看關(guān)于這個volatile關(guān)鍵字的更多解釋。此處同時也給canStop做了初始化。
現(xiàn)在我們看看線程的創(chuàng)建與執(zhí)行的代碼:
i = 0;
// 使用匿名方法定義線程的執(zhí)行體
Thread thread = new Thread(
delegate(object param)
{
// 等待“停止”信號,如果沒有收到信號則執(zhí)行
while (!canStop)
{
i++;
UpdateLabel(i);
}
// 此時已經(jīng)收到停止信號,可以在此釋放資源并
// 初始化變量
canStop = false;
});
thread.Start();
很簡單,在線程的執(zhí)行體中反復(fù)判斷canStop變量是否為true,若是則立刻跳出while循環(huán)(停止變量的自加以及更新界面的操作),然后重新初始化canStop變量為false,以便于下次的使用。
希望本文所述對大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#?Winform消息通知系統(tǒng)托盤氣泡提示框ToolTip控件
這篇文章主要為大家介紹了C#或Winform中的消息通知之系統(tǒng)托盤的氣泡提示框窗口(系統(tǒng)toast通知)、ToolTip控件和ToolTipText屬性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
c#中Empty()和DefalutIfEmpty()用法分析
這篇文章主要介紹了c#中Empty()和DefalutIfEmpty()用法,以實(shí)例形式分析了針對不同情況下Empty()和DefalutIfEmpty()用法區(qū)別,需要的朋友可以參考下2014-11-11
C#使用表達(dá)式樹(LambdaExpression)動態(tài)更新類的屬性值(示例代碼)
這篇文章主要介紹了C#使用表達(dá)式樹(LambdaExpression)動態(tài)更新類的屬性值,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
C#實(shí)現(xiàn)將PDF轉(zhuǎn)為線性化PDF
線性化PDF文件是PDF文件的一種特殊格式,可以通過Internet更快地進(jìn)行查看。這篇文章主要介紹了如何通過C#實(shí)現(xiàn)將PDF轉(zhuǎn)為線性化PDF,感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12

