gpt4 book ai didi

.NET 控制台应用程序退出事件

转载 作者:行者123 更新时间:2023-12-03 05:01:08 27 4
gpt4 key购买 nike

在 .NET 中,是否有一种方法(例如事件)用于检测控制台应用程序何时退出?我需要清理一些线程和 COM对象。

我正在从控制台应用程序运行一个没有表单的消息循环。一个DCOM我正在使用的组件似乎需要应用程序泵消息。

我尝试向 Process.GetCurrentProcess.Exited 和 Process.GetCurrentProcess.Dispose 添加处理程序。

我还尝试向 Application.ApplicationExitApplication.ThreadExit 事件添加处理程序,但它们没有触发。也许这是因为我没有使用表单。

最佳答案

您可以使用ProcessExit事件AppDomain :

class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);
// do some work

}

static void CurrentDomain_ProcessExit(object sender, EventArgs e)
{
Console.WriteLine("exit");
}
}

更新

这是一个完整的示例程序,其中一个空的“消息泵”在单独的线程上运行,允许用户在控制台中输入退出命令以正常关闭应用程序。在 MessagePump 中的循环之后,您可能希望以良好的方式清理线程使用的资源。出于以下几个原因,在此处执行此操作比在 ProcessExit 中执行更好:

  • 避免跨线程问题;如果外部 COM 对象是在 MessagePump 线程上创建的,则在那里处理它们会更容易。
  • ProcessExit 有时间限制(默认为 3 秒),因此如果清理非常耗时,则在该事件处理程序中执行可能会失败。

这是代码:

class Program
{
private static bool _quitRequested = false;
private static object _syncLock = new object();
private static AutoResetEvent _waitHandle = new AutoResetEvent(false);

static void Main(string[] args)
{
AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);
// start the message pumping thread
Thread msgThread = new Thread(MessagePump);
msgThread.Start();
// read input to detect "quit" command
string command = string.Empty;
do
{
command = Console.ReadLine();
} while (!command.Equals("quit", StringComparison.InvariantCultureIgnoreCase));
// signal that we want to quit
SetQuitRequested();
// wait until the message pump says it's done
_waitHandle.WaitOne();
// perform any additional cleanup, logging or whatever
}

private static void SetQuitRequested()
{
lock (_syncLock)
{
_quitRequested = true;
}
}

private static void MessagePump()
{
do
{
// act on messages
} while (!_quitRequested);
_waitHandle.Set();
}

static void CurrentDomain_ProcessExit(object sender, EventArgs e)
{
Console.WriteLine("exit");
}
}

关于.NET 控制台应用程序退出事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1119841/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com