终止正在执行的线程
很多人都說使用Abort方法來終止線程,其實(shí)這種做法并不可取!如果你的線程正在操作臨界資源,很有可能會(huì)造成資源沒有正確釋放而出現(xiàn)死鎖問題。正確的做法應(yīng)該是使用標(biāo)記來終止線程的執(zhí)行。
基本思路是:定義一個(gè)用于描述“停止”信號(hào)的變量,在整個(gè)程序啟動(dòng)前,設(shè)置該變量為false。在線程中,循環(huán)判斷該變量是否已經(jīng)被設(shè)置為true,如果沒有,則繼續(xù)執(zhí)行,否則就退出循環(huán)并釋放資源,然后退出執(zhí)行。當(dāng)我們需要線程退出時(shí),只要設(shè)置這個(gè)“停止”信號(hào)為true即可。 下面我們來看具體的操作步驟。 首先定義一個(gè)“停止”信號(hào)變量: view plaincopy to clipboardprint?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í)行的代碼: view plaincopy to clipboardprint? i?=?0; ?? //?使用匿名方法定義線程的執(zhí)行體 ?? Thread?thread?=?new?Thread( ?? ????delegate(object?param) ?? ????{ ?? ????????//?等待“停止”信號(hào),如果沒有收到信號(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,以便于下次的使用。 這里提供源代碼下載,請(qǐng)下載源代碼工程并在Visual Studio 2008下打開*.sln解決方案文件。 點(diǎn)擊下載此文件
基本思路是:定義一個(gè)用于描述“停止”信號(hào)的變量,在整個(gè)程序啟動(dòng)前,設(shè)置該變量為false。在線程中,循環(huán)判斷該變量是否已經(jīng)被設(shè)置為true,如果沒有,則繼續(xù)執(zhí)行,否則就退出循環(huán)并釋放資源,然后退出執(zhí)行。當(dāng)我們需要線程退出時(shí),只要設(shè)置這個(gè)“停止”信號(hào)為true即可。 下面我們來看具體的操作步驟。 首先定義一個(gè)“停止”信號(hào)變量: view plaincopy to clipboardprint?
?
總結(jié)
- 上一篇: 3PAR推InServ-T级存储 EMC
- 下一篇: Tech.Ed 2008