当中止线程的执行时,我总是怀疑优雅退出与这样的事件处理程序:
int result = WaitHandle.WaitAny(handles);
if (result = WAIT_FINALIZE)
FinalizeAndExit();
并使用该事件来通知线程它必须终止
或只是处理ThreadAbortException以完成线程......
try
{
// Main execution
}
catch(ThreadAbortException e)
{
// FinalizeAndExit();
}
finally
{
}
我通常倾向于使用ThreadAbortException方法,因为它可以被处理但是它会在catch块的末尾重新引发,并且它还避免线程被“危险”方法保持活着,但是我已经看过两种方法。
你有什么看法?是否有任何情况下最好使用一个而不是另一个,或者最好总是使用x?
答案 0 :(得分:5)
通常,它首选的方法。
编写始终正常处理ThreadAbortException的代码很困难(如果不是不可能)。异常可能发生在线程正在进行的任何事情的中间,因此某些情况可能难以处理。
例如,在创建FileStream对象之后但在将引用分配给变量之前,可能会发生异常。这意味着你有一个应该被处理的对象,但是对它的唯一引用会在某个地方丢失...
答案 1 :(得分:2)
如果可以,我可以尝试避免使用Thread.Abort。 Thread.Abort的问题在于它可能发生在(几乎)执行代码的任何行中,并可能导致一些“有趣”的行为(读取:错误)。 Intead我更喜欢在我的代码上有一个退出点来检查一个事件或变量,看它是否应该停止运行并正常退出。
答案 2 :(得分:2)
当然,如果终止事件是预期的,那么它不是例外(通过严格的术语定义),因此你应该使用第一种方法。优雅的退出也表明你掌控着。
虽然例外是有用的,并且在某些情况下是必要的,但它们可以并且确实被过度使用。