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

时间:2009-03-02 14:20:42

标签: c# multithreading exception exception-handling

当中止线程的执行时,我总是怀疑优雅退出与这样的事件处理程序:

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

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

或只是处理ThreadAbortException以完成线程......

try
{
  // Main execution
}
catch(ThreadAbortException e)
{
  // FinalizeAndExit();
}
finally
{
}

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

你有什么看法?是否有任何情况下最好使用一个而不是另一个,或者最好总是使用x?

3 个答案:

答案 0 :(得分:5)

通常,它首选的方法。

编写始终正常处理ThreadAbortException的代码很困难(如果不是不可能)。异常可能发生在线程正在进行的任何事情的中间,因此某些情况可能难以处理。

例如,在创建FileStream对象之后但在将引用分配给变量之前,可能会发生异常。这意味着你有一个应该被处理的对象,但是对它的唯一引用会在某个地方丢失...

答案 1 :(得分:2)

如果可以,我可以尝试避免使用Thread.Abort。 Thread.Abort的问题在于它可能发生在(几乎)执行代码的任何行中,并可能导致一些“有趣”的行为(读取:错误)。 Intead我更喜欢在我的代码上有一个退出点来检查一个事件或变量,看它是否应该停止运行并正常退出。

答案 2 :(得分:2)

当然,如果终止事件是预期的,那么它不是例外(通过严格的术语定义),因此你应该使用第一种方法。优雅的退出也表明你掌控着。

虽然例外是有用的,并且在某些情况下是必要的,但它们可以并且确实被过度使用。