C# - 在进程退出之前暂停主线程并清理

时间:2009-07-28 06:03:02

标签: c# mono

当我的进程要退出时,如何执行某些代码?我试过这个:

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)。

谢谢!

澄清:我可以通过在单独的线程上启动和停止服务器并轮询“请求停止”标志(将在ProcessExit事件处理程序中设置)来完成我想要做的事情每隔X毫秒在主线程上。如果可能的话,我想避免这个解决方案(额外的线程,cpu周期)。我只是希望主线程暂停,直到进程退出的时候,它应该告诉服务器停止。可能的?

3 个答案:

答案 0 :(得分:2)

您的Thread.Sleep正在阻止。你将不得不考虑一个更好的主意。如果不知道服务器如何运行,我就无法帮助。

答案 1 :(得分:2)

我遇到过类似的问题。在我工作的地方,我们有一组库,这些库被我们编写的每个客户端应用程序使用,其中包含需要在应用程序退出时执行的清理代码。 AppDomain.CurrentDomain.ProcessExit对我们很有用,我们必须使用该方法,因为我们不能依赖顶级应用程序(运行Program.Main)来显式调用我们的清理方法,也不能控制它(因为它不是我们的代码,它属于使用我们库的用户)。

但是......在您的情况下,我认为您不必担心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服务管理器处理为您调用这些。最终,真正的问题是确保你不会永远沉睡......你需要一些方法来表示你的应用程序退出。有很多方法可以做到这一点,这取决于你打算如何运行你的应用程序。

答案 2 :(得分:1)

对需要清理的对象实施IDisposable,并在应用程序/服务器关闭时对它们Dispose()。一切都是快乐的核桃,它会自动进行。 :)