[英]ThreadAbortException vs graceful event handle exit in C#
當中止線程的執行時,我總是懷疑優雅退出與事件處理程序,如下所示:
int result = WaitHandle.WaitAny(handles);
if (result = WAIT_FINALIZE)
FinalizeAndExit();
並使用事件來通知線程它必須終止
或者只是處理ThreadAbortException來完成線程......
try
{
// Main execution
}
catch(ThreadAbortException e)
{
// FinalizeAndExit();
}
finally
{
}
我通常傾向於使用ThreadAbortException方法,因為它可以被處理但是它會在catch塊的末尾重新引發,並且它也避免了線程被“危險”方法保持活着,但我已經看到了兩種方法。
你怎么看? 是否有任何情況下最好使用一個而不是另一個,或者最好總是使用x?
通常,它是首選的方法。
編寫始終優雅處理ThreadAbortException的代碼很難(如果不是不可能)。 異常可能發生在線程正在進行的任何事情的中間,因此某些情況可能難以處理。
例如,在創建FileStream對象之后但在將引用分配給變量之前,可能會發生異常。 這意味着你有一個應該被處置的對象,但是對它的唯一引用在某個地方丟失了...
如果我可以嘗試避免使用Thread.Abort。 Thread.Abort的問題在於它可能發生在(幾乎)執行代碼的任何行中,並可能導致一些“有趣”的行為(讀取:錯誤)。 Intead我更喜歡在我的代碼上有一個退出點,它檢查一個事件或變量,看它是否應該停止運行並正常退出。
當然,如果終止事件是預期的,那么它不是例外(通過嚴格的術語定義),因此您應該使用第一種方法。 優雅的退出也表明你掌控着。
雖然異常是有用的,並且在某些情況下是必要的,但它們可以並且確實被過度使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.