2012-11-17 46 views
-1

如果一個例程通過System.Threading.Timer定期運行,那麼可以做些什麼來防止由於宿主應用程序的終止導致該例程在中途中止呢?如何防止由於應用程序終止而中止線程?

+1

該計時器屬於應用程序;如果應用程序終止,那麼定時器就這樣。如果您的應用程序正常關閉,您可以發信號給定時器例程進行清理,但如果有人強制中止應用程序,則可以做的事情不多。 – Joe

+0

@Joe:會有一些方法讓計時器線程繼續進行當前的迭代,然後終止? – CJ7

+0

@ CJ7:如果應用程序的一部分沒有完成,則根據定義,應用程序還沒有完成。 – Vlad

回答

0

那麼,如果應用程序正在終止,你不可能做任何事情;但是你可以阻止隱含應用程序終止退出main(關閉主窗口等),如果你打開一個非後臺線程。

您可以讓計時器在該線程上運行,但是您不能在System.Threading.Timer上運行該計時器,因爲它在線程池線程(它們是後臺線程)上運行。你可以e。 G。在該線程上啓動調度程序並運行DispatcherTimer(如果您使用的是WPF)。

0

沒有辦法保證你的線程不會異常終止。任何數量的東西都可能出錯:意外的電源故障,用戶使用任務管理器終止應用程序,或者程序中會使線程崩潰的錯誤只有三種可能性。

如果您正在進行多階段數據庫更新,如果中斷,會使數據庫處於損壞或不一致狀態,那麼您應該使用事務。

0

此代碼應導致主線程阻塞10秒,等待任何排隊計時器回調完成。這可以在主機應用程序的退出點運行。

Dim waitHnd As WaitHandle = New AutoResetEvent(False) 
Timer1.Dispose(waitHnd) 
waitHnd.WaitOne(10000) 
相關問題