.net 如何防止因应用程序终止而中止线程?

.net 如何防止因应用程序终止而中止线程?,.net,multithreading,timer,.net,Multithreading,Timer,如果一个例程通过System.Threading.Timer定期运行,那么可以做些什么来防止由于主机应用程序的终止而中途中止该例程?如果应用程序正在终止,您不可能做任何事;但是,如果打开非后台线程,可以通过退出main(关闭主窗口等)来防止隐式应用程序终止 您可以使计时器在该线程上运行,但是不能使用System.Threading.timer,因为它在线程池线程(后台线程)上运行。你可以用e。G在该线程上启动一个调度程序并运行一个调度程序(如果您使用的是WPF)。无法保证线程不会异常终止。很多事

如果一个例程通过
System.Threading.Timer
定期运行,那么可以做些什么来防止由于主机应用程序的终止而中途中止该例程?

如果应用程序正在终止,您不可能做任何事;但是,如果打开非后台线程,可以通过退出
main
(关闭主窗口等)来防止隐式应用程序终止


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

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


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

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

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

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