[英]C# - Pause main thread and clean up before process exit
我的流程即將退出時,如何執行一些代碼? 我已經試過了:
public static void Main(string[] args) {
StartUpMyServer();
AppDomain.CurrentDomain.ProcessExit += delegate(object sender, EventArgs e)
{
Console.WriteLine("process exiting!");
TellMyServerToStopAcceptingConnectionsAndWaitUntilItsFinishedWithAnyExistingOnes();
};
Thread.Sleep(Timeout.Infinite);
}
永遠不會打印“進程退出”,似乎什么也沒有發生。
無論是什么,它都必須是跨平台的(Mono / Linux / OS X / Windows)。
謝謝!
澄清:我可以通過在單獨的線程上啟動和停止服務器,並每隔X ms輪詢主線程上的“停止請求”標志(將在ProcessExit事件處理程序中設置)來完成我想做的事情。 如果可能的話,我想避免這種解決方案(額外的線程,CPU周期)。 我只想讓主線程掛起,直到該進程退出時才應該告訴服務器停止。 可能?
您的Thread.Sleep正在阻止。 您將不得不考慮一個更好的主意。 不知道您的服務器如何運行,我無濟於事。
我遇到了類似的問題。 在我工作的地方,我們有一組庫可供編寫的每個客戶端應用程序使用,其中包含需要在應用程序退出時執行的清除代碼。 AppDomain.CurrentDomain.ProcessExit對我們來說非常有用,我們必須使用該方法,因為我們不能依賴頂級應用程序(運行Program.Main)來顯式調用我們的cleanup方法,也不能對此進行任何控制(由於它不是我們的代碼,因此它屬於使用我們庫的用戶)。
但是...根據您的情況,我認為您無需擔心ProcessExit事件來觸發您的清理代碼。 您正在編寫某種托管在控制台應用程序中的網絡服務器。 怎么樣:
public static void Main(string[] args)
{
StartUpMyServer();
Console.WriteLine("Press the ESCAPE key to shut down the server.");
while (Console.ReadKey(true).Key != ConsoleKey.Escape);
ShutDownMyServer();
}
然后,當用戶按下ESCAPE時,您的服務器將關閉。 為網絡服務器執行此操作的一種非常優雅的方法是創建Windows服務,該服務將為您提供方便的OnStart()和OnStop()方法,其中僅包含您合適的啟動和關閉代碼,並且Windows服務管理器會為您處理這些調用。 最終,真正的問題是確保您不會永遠睡覺……您需要某種方式來通知您的應用程序退出。 有很多方法可以做到,這完全取決於您打算如何運行應用程序。
在需要清理的對象上實現IDisposable
,並在應用程序/服務器關閉時將它們Dispose()
。 一切順利之后,它將自動進行。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.