C#多线程之旅(七)——终止线程
閱讀目錄
- 一、什么時候用Thread.Abort();
- 二、Thread.Abort的用法
- 三、無法終止線程的情形
- 四、Catch塊中拋出異常
- 五、Finally塊中拋出異常
- 六、Abort調用的時間
先交代下背景,寫《C#多線程之旅》這個系列文章主要是因為以下幾個原因:1.多線程在C/S和B/S架構中用得是非常多的;2.而且多線程的使用是非常復雜的,如果沒有用好,容易造成很多問題。
回到頂部
一、什么時候用Thread.Abort();
當我們想要立即終止一個線程時,可以用調用Thread.Abort方法來終止線程。這個和協作式取消不一樣。
終止當前線程時會在當前線程上引發ThreadAbortException?異常。ThreadAbortExcetion是一個可以被應用程序捕獲的特殊異常,在catch 塊中會自動重新拋出這個異常,除非在catch塊中調用ResetAbort方法。ResetAbort方法可以取消掉終止的請求,而且可以防止catch中再次拋出的ThreadAbortException終止當前線程。未執行的Finally塊會在線程終止前執行。
回到頂部
二、Thread.Abort的用法
例子:
| ?
| ||||||||||||||
| ? (1)調用Thread.Abort()的輸出結果: ? (2)未調用Thread.Abort()輸出結果: ? (3)流程: (1)當主線程調用myThread.Abort()后,線程myThread拋出異常,線程myThread捕獲到異常 (2)在myThread catch塊中 如果調用Thread.ResetAbort()----- ???? Step1.取消終止線程的請求,并恢復線程,繼續執行ResetAbort后面的語句,然后執行catch塊之后的語句 ???? Step2.若catch塊之后有Finally塊,則執行執行Finally塊,然后執行Finally塊后面的語句。 ?如果沒有調用Thread.ResetAbort()---- ????? 1.finally塊在線程終止前執行,finally塊之后的語句不會被執行,然后線程終止。 |
?
回到頂部
三、無法終止線程的情形
當調用線程的Abort方法時,不能保證線程立即終止,有可能永遠不能終止。這種情形發生在catch或finally塊中存在長時間或無限的耗時操作時。
只有當catch或finally塊中代碼執行完才能終止線程。所以我們可以調用線程的Join方法來等待線程的完成或終止。
回到頂部
四、Catch塊中拋出異常
應用程序將會被終止,Finally塊不會被執行
?
回到頂部
五、Finally塊中拋出異常
應用程序將會被終止
?
回到頂部
六、Abort調用的時間
(1)線程Start之前調用Abort
線程會在Start被調用時終止線程。
(2)線程Sleeping的時候調用Abort
線程被中斷,然后終止線程
(3)線程Blocked的時候調用Abort
線程被中斷,然后終止線程
(4)線程被掛起的時候調用Abort
Throw ThreadStartException 引發Abort的調用,然后AbortRequested 被加到正在被終止的線程的ThreadState屬性
(5)一個托管線程正在執行非托管代碼時調用Abort
ThreadAbortException不會被拋出直到線程返回托管代碼。
(6)如果同時Abort兩個線程,有可能一個線程會設置狀態信息,而另外一個線程執行Abort的方法。然而,應用程序不會檢測到這種情形。
?
作 者:?Jackson0714?
出 處:http://www.cnblogs.com/jackson0714/?
關于作者:專注于微軟平臺的項目開發。如有問題或建議,請多多賜教!?
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。?
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步?;蛘咧苯铀叫盼?
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!?
總結
以上是生活随笔為你收集整理的C#多线程之旅(七)——终止线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SharePoint 2013开发入门探
- 下一篇: C#多线程之旅(3)——线程池