簡體   English   中英

C#-暫停主線程並在進程退出之前清理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM