当中止线程的执行时,我总是怀疑在正常退出与事件处理程序之间是这样的:

int result = WaitHandle.WaitAny(handles);
if (result = WAIT_FINALIZE)
  FinalizeAndExit();

并使用该事件来通知线程它必须终止

或者只是处理ThreadAbortException来最终确定线程...
try
{
  // Main execution
}
catch(ThreadAbortException e)
{
  // FinalizeAndExit();
}
finally
{
}

我通常倾向于使用ThreadAbortException方法,因为它可以处理,但是会在catch块的末尾重新引发,并且还避免了线程通过“诡异”方法保持 Activity 状态,但是我已经看到了两种方法。

你怎么看?在任何情况下,最好相互使用,还是总是使用x?

最佳答案

通常,第一种方法更可取。

很难(即使不是不可能)编写将始终优雅地处理ThreadAbortException的代码。异常可能发生在线程恰巧正在执行的中间,因此某些情况可能很难处理。

例如,在创建FileStream对象之后,但在将引用分配给变量之前,可能会发生异常。这意味着您有一个应处置的对象,但是对该对象的唯一引用在某个位置的堆栈上丢失了...

10-04 12:34