簡體   English   中英

ThreadAbortException與C#中的graceful事件句柄退出

[英]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.

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