【问题标题】:How to prevent aborting of thread due to app termination?如何防止由于应用程序终止而中止线程?
【发布时间】:2012-11-17 22:38:56
【问题描述】:

如果例程通过System.Threading.Timer 定期运行,如何防止该例程由于主机应用程序终止而中途中止?

【问题讨论】:

  • 定时器归应用所有;如果应用程序终止,计时器也会终止。如果您的应用程序正常关闭,您可以向计时器例程发出信号以进行清理,但如果有人强制中止应用程序,您无能为力。
  • @Joe: 有没有办法让计时器线程继续当前的迭代然后终止?
  • @CJ7:如果应用程序的一部分没有完成,根据定义,应用程序也没有完成。
  • @Vlad:应用程序在技术上是否“完成”不是我关心的问题。我需要的是防止计时器例程被中断,因为它可能无法完成必要的数据库更新等。我不介意这是否在主机应用程序似乎已终止后继续运行。
  • 如果有人拔掉插头怎么办?您应该为事情在您期望完成的一切完成之前终止的可能性做好准备,完成。在正常的终止情况下,您应该能够向计时器线程发出信号以立即结束。

标签: .net multithreading timer


【解决方案1】:

好吧,如果应用程序终止,您将无法做任何事情;但是,如果您打开非后台线程,可以通过退出main(关闭主窗口等)来防止隐式应用程序终止。

您可以使计时器在该线程上运行,但是您不能使用System.Threading.Timer 来执行此操作,因为它在线程池线程(后台线程)上运行。你可以G。在该线程上启动调度程序并运行DispatcherTimer(如果您使用的是 WPF)。

【讨论】:

    【解决方案2】:

    没有办法保证你的线程不会被异常终止。任何事情都可能出错:意外的电源故障、用户使用任务管理器终止应用程序或程序中的错误导致线程崩溃,这只是三种可能性。

    如果您正在进行多阶段数据库更新,如果被中断,会使您的数据库处于损坏或不一致的状态,那么您应该使用事务。

    【讨论】:

      【解决方案3】:

      此代码应导致主线程阻塞 10 秒,等待任何排队的计时器回调完成。这可以在宿主应用程序的退出点运行。

      Dim waitHnd As WaitHandle = New AutoResetEvent(False)
      Timer1.Dispose(waitHnd)
      waitHnd.WaitOne(10000)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多