繁体   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