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