【问题标题】:Is there a way to ensure entire code block execution in a .NET thread?有没有办法确保在 .NET 线程中执行整个代码块?
【发布时间】:2008-09-06 00:59:14
【问题描述】:

在我的 C# 程序中,我有一个表示正在运行的测试的线程,可以通过单击标有“中断执行”的按钮来中止它。为了使线程(以及测试)以优雅的方式终止(并预先完成一些重要的工作),此按钮仅在某些明确定义的时刻启用,其中我捕捉到ThreadAbortedException,执行Thread.ResetAbort()并漂亮地死去(即线程)。

问题在于,在可以中止的时间窗口内,一旦启动,有些任务需要从头到尾完成,因此,我担心 TAE。锁并没有为此提供解决方案,虽然 finally 块可以,但我认为以以下方式包装重要代码并不优雅:

try {
} finally {
  // vital code
}

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

这是另一种将ThreadAbortException的干扰延迟到区块结束的方法吗?

【问题讨论】:

    标签: .net multithreading


    【解决方案1】:

    产生 ThreadAbortException 的情况可能很复杂。更好的选择可能是询问您为什么要使用 ThreadAbortExceptions。

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

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

    【讨论】:

      【解决方案2】:

      使用Thread.BeginCriticalRegion()

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

      Thread.BeginCriticalRegion()
      
      //do important stuff here
      
      Thread.EndCriticalRegion()
      

      【讨论】:

      • 虽然 BeginCriticalRegion() 可能在某种程度上确保代码执行,因为您的应用程序可能会停止,否则我想要一个不允许 ThreadAbortExceptions 中断我的代码的设备。
      猜你喜欢
      • 2013-03-12
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 2013-04-06
      • 2010-09-24
      • 2012-08-31
      相关资源
      最近更新 更多