C#實(shí)現(xiàn)終止正在執(zhí)行的線程
本文實(shí)例講述了C#實(shí)現(xiàn)終止正在執(zhí)行的線程的實(shí)現(xiàn)方法,并針對(duì)一些容易出錯(cuò)的地方進(jìn)行了深入分析,具體方法如下:
一般來(lái)說(shuō),很多人都會(huì)使用Abort方法來(lái)終止線程,其實(shí)這種做法并不可??!如果你的線程正在操作臨界資源,很有可能會(huì)造成資源沒(méi)有正確釋放而出現(xiàn)死鎖問(wèn)題。正確的做法應(yīng)該是使用標(biāo)記來(lái)終止線程的執(zhí)行。
基本思路是:定義一個(gè)用于描述“停止”信號(hào)的變量,在整個(gè)程序啟動(dòng)前,設(shè)置該變量為false。在線程中,循環(huán)判斷該變量是否已經(jīng)被設(shè)置為true,如果沒(méi)有,則繼續(xù)執(zhí)行,否則就退出循環(huán)并釋放資源,然后退出執(zhí)行。當(dāng)我們需要線程退出時(shí),只要設(shè)置這個(gè)“停止”信號(hào)為true即可。
下面我們來(lái)看具體的操作步驟。
首先定義一個(gè)“停止”信號(hào)變量:
private volatile bool canStop = false;
注意這里我們使用了volatile關(guān)鍵字,因?yàn)閏anStop變量將會(huì)被調(diào)用線程和執(zhí)行線程同時(shí)使用,即在調(diào)用線程中初始化以及設(shè)置它的值,而在執(zhí)行線程中判斷它的值。這樣做就告訴編譯器,這個(gè)canStop變量將被多個(gè)線程所使用,強(qiáng)制編譯器不對(duì)其狀態(tài)進(jìn)行優(yōu)化。如果有興趣可以上MSDN查看關(guān)于這個(gè)volatile關(guān)鍵字的更多解釋。此處同時(shí)也給canStop做了初始化。
現(xiàn)在我們看看線程的創(chuàng)建與執(zhí)行的代碼:
i = 0;
// 使用匿名方法定義線程的執(zhí)行體
Thread thread = new Thread(
delegate(object param)
{
// 等待“停止”信號(hào),如果沒(méi)有收到信號(hào)則執(zhí)行
while (!canStop)
{
i++;
UpdateLabel(i);
}
// 此時(shí)已經(jīng)收到停止信號(hào),可以在此釋放資源并
// 初始化變量
canStop = false;
});
thread.Start();
很簡(jiǎn)單,在線程的執(zhí)行體中反復(fù)判斷canStop變量是否為true,若是則立刻跳出while循環(huán)(停止變量的自加以及更新界面的操作),然后重新初始化canStop變量為false,以便于下次的使用。
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#開(kāi)源的AOP框架--KingAOP基礎(chǔ)
這篇文章主要介紹了一款C#開(kāi)源的AOP框架--KingAOP框架的基礎(chǔ)知識(shí),對(duì)于想學(xué)習(xí)AOP的小伙伴來(lái)說(shuō),非常不錯(cuò),希望大家能夠喜歡。2015-12-12
C#處理猜拳問(wèn)題的簡(jiǎn)單實(shí)例(非窗體)
下面小編就為大家?guī)?lái)一篇C#處理猜拳問(wèn)題的簡(jiǎn)單實(shí)例(非窗體)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07
C#枚舉類(lèi)型與結(jié)構(gòu)類(lèi)型實(shí)例解析
這篇文章主要介紹了C#枚舉類(lèi)型與結(jié)構(gòu)類(lèi)型實(shí)例,需要的朋友可以參考下2014-07-07
C#入門(mén)之窗體的簡(jiǎn)單用法實(shí)例
這篇文章主要介紹了C#入門(mén)之窗體的簡(jiǎn)單用法,以實(shí)例形式分析了注冊(cè)頁(yè)面程序的實(shí)現(xiàn)過(guò)程,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
C#?Winform實(shí)現(xiàn)圓角無(wú)鋸齒按鈕
這篇文章主要介紹了C#?Winform實(shí)現(xiàn)圓角無(wú)鋸齒按鈕,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-08-08
C#使用泛型方法實(shí)現(xiàn)操作不同數(shù)據(jù)類(lèi)型的數(shù)組
這篇文章主要為大家詳細(xì)介紹了C#如何使用一個(gè)泛型方法對(duì)不同類(lèi)型的數(shù)組進(jìn)行操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02

