代码之家  ›  专栏  ›  技术社区  ›  Jorge Córdoba

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

  •  2
  • Jorge Córdoba  · 技术社区  · 17 年前

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

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

    或者只是处理ThreadAbortException以完成线程。。。

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

    你怎么看?是否有任何情况下最好使用一种方法而不是另一种方法,或者最好使用始终方法x?

    3 回复  |  直到 8 年前
        1
  •  5
  •   Guffa    17 年前

    一般来说,第一种方法更可取。

    编写始终能够优雅地处理ThreadAbortException的代码很难(如果不是不可能的话)。异常可能发生在线程所做的任何事情的中间,所以有些情况很难处理。

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

        2
  •  2
  •   Dror Helper    17 年前

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

        3
  •  2
  •   ChrisF    17 年前

    当然,如果终止事件是预期的,那么它不是一个例外(根据术语的严格定义),因此您应该使用第一种方法。优雅的退出也表明你处于控制之中。

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