Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的ThreadAbortException与优雅事件句柄退出#_C#_Multithreading_Exception_Exception Handling - Fatal编程技术网

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,你可以在线程上设置背景标志,如果你不能自己结束,那么当你的应用程序结束时,它将被杀死。