C# C中的ThreadAbortException与优雅事件句柄退出#
当中止线程的执行时,我总是怀疑是否有这样一个事件处理程序可以正常退出:C# C中的ThreadAbortException与优雅事件句柄退出#,c#,multithreading,exception,exception-handling,C#,Multithreading,Exception,Exception Handling,当中止线程的执行时,我总是怀疑是否有这样一个事件处理程序可以正常退出: int result = WaitHandle.WaitAny(handles); if (result = WAIT_FINALIZE) FinalizeAndExit(); 并使用事件通知线程它必须终止 或者只是处理ThreadAbortException以完成线程 try { // Main execution } catch(ThreadAbortException e) { // FinalizeAn
int result = WaitHandle.WaitAny(handles);
if (result = WAIT_FINALIZE)
FinalizeAndExit();
并使用事件通知线程它必须终止
或者只是处理ThreadAbortException以完成线程
try
{
// Main execution
}
catch(ThreadAbortException e)
{
// FinalizeAndExit();
}
finally
{
}
我通常倾向于使用ThreadAbortException方法,因为它可以被处理,但会在catch块的末尾被重新提升,而且它还可以避免线程被“危险”的方法保持活动状态,但我已经看到了这两种方法
你怎么看?是否有任何情况下最好使用一个而不是另一个,或者最好使用始终接近x?如果可以,我会尝试避免使用Thread.Abort。 Abort的问题在于它可能发生在(几乎)任何一行执行代码中,并可能导致一些“有趣的”行为(读:bug)。
Intead我更喜欢在我的代码上有一个退出点,检查事件或变量,看看它是否应该停止运行并正常退出。一般来说,第一个方法是它更喜欢的 编写始终能够优雅地处理ThreadAbortException的代码很难(如果不是不可能的话)。异常可能发生在线程所做的任何事情的中间,所以有些情况很难处理。
例如,异常可能发生在创建FileStream对象之后,但在将引用分配给变量之前。这意味着您有一个应该处理的对象,但对它的唯一引用在堆栈的某个地方丢失了…当然,如果预期终止事件,那么它不是例外(根据术语的严格定义),因此您应该使用第一种方法。优雅的退出也表明你处于控制之中
虽然异常是有用的,并且在某些情况下是必要的,但它们可以而且确实会被过度使用。另一方面,如果我不中止线程,我永远无法真正确定线程是否会保持活动状态,阻止我的主执行。+1。“事实上,线程中止异常是纯粹的邪恶,你永远不应该使用它们。”-C#编译器团队成员Eric Lippert@Jorge Córdoba,你可以在线程上设置背景标志,如果你不能自己结束,那么当你的应用程序结束时,它将被杀死。