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

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归因
不隶属于 StackOverflow
scroll top