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

C# C-暂停主线程并在进程退出前清理,c#,mono,C#,Mono,当我的进程要退出时,如何执行一些代码?我试过这个: public static void Main(string[] args) { StartUpMyServer(); AppDomain.CurrentDomain.ProcessExit += delegate(object sender, EventArgs e) { Console.WriteLine("process exiting!"); TellMyServerToSto

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

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/osx/Windows

谢谢


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

您的线程。睡眠被阻塞。你得想个更好的主意。如果不知道服务器如何运行,我就无能为力。

在需要清理的对象上实现IDisposable,并在应用程序/服务器关闭时进行处理。一切顺利后,它会自动进行

我遇到了类似的问题。在我工作的地方,我们有一组库,供我们编写的每个客户端应用程序使用,其中包含在应用程序退出时需要执行的清理代码。AppDomain.CurrentDomain.ProcessExit对我们来说非常有用,我们必须使用该方法,因为我们不能依赖运行程序的顶级应用程序。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服务,它将为您提供方便的启动和停止方法,您只需包含适当的启动和关闭代码,Windows服务管理器将为您处理这些调用。最终,真正的问题是确保你不会永远睡觉。。。您需要某种方式来发出退出应用程序的信号。有很多方法可以做到这一点,这完全取决于你打算如何运行你的应用程序。

我想可能就是这样。那么,在主函数退出后,该事件会出现在主线程上?或者…?在这种情况下,唯一需要的“清理”是在服务器上调用该方法,这与其说是清理,不如说是让它在进程结束之前完成它正在做的事情。关闭,但实际上我需要能够以跨平台的方式响应SIGHUP/kill或类似操作。在我的例子中,此进程正由另一个进程启动和停止,使用System.Diagnostics.process.Dough进行了一些挖掘,似乎创建Windows服务是最好的方法。然而不幸的是,mono的服务支持mono服务不允许您将命令行参数传递给您的服务!我将看看我是否能在本周或周末的某个时候提交补丁。谢谢你的提示。