簡體   English   中英

Thread.Abort() 什么時候不會真正中止?

[英]When will Thread.Abort() not actually abort?

所以你讀了標題,Thread.Abort() 什么時候不會真正中止? 我聽到很多人說這是一個危險的命令,並且永遠不能保證它有效,但我從來沒有真正能夠重現它。 它總是對我有用..

是否有可能導致Thread.Abort的()來consistantly失敗的任何具體情況?

你甚至閱讀過文檔嗎?

該線程不能保證立即中止,或者根本不中止。 如果線程在作為中止過程的一部分調用的 finally 塊中進行無限量的計算,從而無限期地延遲中止,就會發生這種情況。 要等到線程中止,您可以在調用 Abort 方法后對該線程調用 Join 方法,但不能保證等待會結束。

...

如果在尚未啟動的線程上調用 Abort,則在調用 Start 時該線程將中止。 如果在阻塞或休眠的線程上調用 Abort,則該線程將被中斷然后中止。

如果在已掛起的線程上調用 Abort,則會在調用 Abort 的線程中拋出 ThreadStateException,並將 AbortRequested 添加到正在中止的線程的 ThreadState 屬性中。 在調用 Resume 之前,不會在掛起的線程中拋出 ThreadAbortException。

如果在托管線程執行非托管代碼時在托管線程上調用 Abort,則在線程返回托管代碼之前不會拋出 ThreadAbortException。

如果兩個對 Abort 的調用同時到來,則有可能一個調用設置狀態信息,另一個調用執行 Abort。 但是,應用程序無法檢測到這種情況。

在線程上調用 Abort 后,該線程的狀態包括 AbortRequested。 在線程因成功調用 Abort 而終止后,線程的狀態將更改為已停止。 如果有足夠的權限,作為 Abort 目標的線程可以使用 ResetAbort 方法取消中止。 有關演示如何調用 ResetAbort 方法的示例,請參閱 ThreadAbortException 類。

還有一種情況是 Thread.Abort() 調用沒有失敗,但線程沒有終止。 拋出的 ThreadAbortException 可以被線程本身捕獲。 如果這樣做,然后在 catch 處理程序中調用 Thread.ResetAbort(),則不會在 catch 塊的末尾重新拋出 ThreadAbortException。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM