代码之家  ›  专栏  ›  技术社区  ›  André Chalella

有没有办法确保整个代码块在.NET线程中执行?

  •  2
  • André Chalella  · 技术社区  · 17 年前

    在我的C程序中,我有一个线程代表一个正在运行的测试,点击一个标记为“中断执行”的按钮可以中止该测试。为了让线程(因此测试)以优雅的方式终止(并且预先做一些重要的工作),这个按钮只在一些定义良好的时刻启用,在这个时刻我捕捉到 ThreadAbortedException Thread.ResetAbort() 死得漂亮(也就是线头)。

    问题是,在可能中止的时间窗口中,有一些任务需要在启动后从头到尾完成,因此,我担心TAE。锁并不能解决这个问题,尽管最后一个块可以解决这个问题,但我发现用以下方式包装重要代码并不优雅:

    try {
    } finally {
      // vital code
    }
    

    但是,我没有找到其他解决方案。

    这是另一种延迟干扰的方法吗? ThreadAbortException 直到街区尽头?

    2 回复  |  直到 17 年前
        1
  •  4
  •   Rob Walker    17 年前

    在这种情况下,会产生一个线程异常可能是复杂的。一个更好的选择可能是问你为什么要使用三重或三重异常。

    更好的模式是简单地使用一个标志向运行中的线程指示它应该中止,然后在运行中定期测试该标志。如果设置了它,您可以在需要的时候抛出一个异常。

    使用这种模式,您完全可以控制线程何时执行中止操作,并且不必担心关键操作被中断。

        2
  •  3
  •   Nils Pipenbrinck    17 年前

    使用 Thread.BeginCriticalRegion()

    通知主机执行将要进入代码区域,其中线程中止或未处理异常的影响可能会危及应用程序域中的其他任务。

    Thread.BeginCriticalRegion()
    
    //do important stuff here
    
    Thread.EndCriticalRegion()
    
    推荐文章