3 回答

TA貢獻1865條經驗 獲得超7個贊
Thread.Abort()
ThreadAbortException
在線程上注入a 。線程可以通過調用取消請求Thread.ResetAbort()
。此外,還有某些代碼部分,例如finally
將在處理異常之前執行的塊。如果線程由于某種原因卡在這樣的塊中,則永遠不會在線程上引發異常。
由于調用者在調用時幾乎沒有控制線程的狀態Abort()
,因此通常不建議這樣做。將消息傳遞給請求終止的線程。

TA貢獻1111條經驗 獲得超0個贊
在哪種情況下它不會終止線程?
這個問題是重復的。
使用Thread.Abort()有什么問題
還有其他終止線程的可能性嗎?
是。您的問題在于,您永遠不要啟動無法禮貌地告知要停止的線程,并且該線程會及時停止。如果您必須啟動一個線程,該線程可能會(1)難以停止,(2)越野車或最糟糕的(3)對用戶不利的情況,那么正確的做法是使一個新進程,在新進程中啟動線程,然后在您希望線程中斷時終止該進程。唯一可以確保安全終止不合作的線程的事情是操作系統,將其整個過程都銷毀了。
有關更多詳細信息,請參見我對這個問題的回答過長:
在C#中的循環內使用lock語句
最后一點是相關的,我討論了在中止線程之前應該等待多長時間殺死線程的注意事項。

TA貢獻1829條經驗 獲得超13個贊
為什么不總是?在什么情況下它不終止線程?
對于初學者來說,線程可能會抓住ThreadAbortException并取消自己的終止。否則,它可能會導致您嘗試中止計算所需的時間。因此,運行時無法保證在您請求線程之后線程將始終終止。
ThreadAbortException 有更多:
調用Abort方法銷毀線程時,公共語言運行庫將引發ThreadAbortException。ThreadAbortException是可以捕獲的特殊異常,但是它將在catch塊的末尾自動再次引發。引發此異常時,運行時將在結束線程之前執行所有的finally塊。由于線程可以在finally塊中進行無限制的計算,或調用Thread.ResetAbort()取消中止,因此無法保證線程將永遠結束。
您不需要Abort()手動創建線程。如果您只是讓線程中的方法返回,那么CLR將為您完成所有的工作。這將正常結束線程。
- 3 回答
- 0 關注
- 2588 瀏覽
添加回答
舉報