Dot-Net

管理 .NET 應用程序以在終止/終止時正常關閉

  • February 16, 2018

我們有一個具有許多前台執行緒的 .NET 控制台應用程序。如果我們使用任務管理器或發出 killjob,從 windows 中的命令行殺死程序,是否有一種方法可以優雅地關閉應用程序(在 .net 控制台應用程序中添加管理程式碼),就像擁有一個函式被稱為 TodoBeforeShutdown() 來處理對象、關閉任何打開的連接等。

PS - 我閱讀了其他執行緒,他們都提出了終止程序的不同方法,而不是我的具體問題,在 .NET 託管程式碼中,我們可以處理終止程序的最佳方法是什麼。

提前致謝。

不幸的是,當程序被終止時,不會引發您可以處理的事件。
您可以考慮像切斷電腦電源一樣終止程序——無論您設計了在系統關閉時執行什麼程式碼,如果電腦不能正常或正常關閉,則該程式碼將不會執行。

當您使用任務管理器殺死一個程序時,它會呼叫 Win32TerminateProcess函式,該函式會無條件地強制該程序(包括其所有擁有的執行緒)退出。暫停所有執行緒/程序的執行,並取消所有掛起的 I/O 請求。你的程序實際上已經死了。TerminateProcess函式不會呼叫 CLR 提供的關閉序列,因此您的託管應用程序甚至不會知道正在關閉。

您建議您在應用程序的程序終止時關注處置對象,但這裡有幾件事值得指出:

  • 始終努力將可能造成的損害降至最低。盡可能早地處理你的物品,只要你用完它們。不要等到以後。在任何給定時間,當您的程序程序終止時,您應該只保留最少數量的對象,這將減少洩漏的可能性。
  • 作業系統通常會在終止時清理並釋放大部分這些資源(即句柄等)。
  • 最後,不言而喻,以這種方式終止程序確實是一種例外情況——即使某些資源洩漏,這也是意料之中的。您不應該以這種方式關閉應用程序,就像您不應該殺死必要的 Windows 系統程序一樣(即使您以管理員身份執行時也可以)。

如果這是您關閉控制台應用程序的正常計劃,您需要找到另一個計劃

引用自:https://stackoverflow.com/questions/4266489