.net - 管理 .NET 应用程序以在终止/终止时正常关闭

标签 .net process kill handle

我们有一个具有许多前台线程的 .NET 控制台应用程序。
如果我们使用任务管理器或发出 killjob 终止进程,从 Windows 中的命令行终止,有没有一种方法可以优雅地关闭应用程序(在 .net 控制台应用程序中添加托管代码),例如拥有一个函数被调用说 TodoBeforeShutdown() 处理对象,关闭任何打开的连接等。

附言- 我阅读了其他线程,他们都提出了终止进程的不同方法,而不是我的具体问题,即在 .NET 托管代码中处理终止进程的最佳方法是什么。

提前致谢。

最佳答案

不幸的是,无论何时终止进程,都不会引发您可以处理的事件。 您可以考虑终止一个进程,例如切断计算机的电源——无论您设计什么代码在系统关闭时运行,如果计算机没有正常或正确关闭,该代码将不会运行。

当您使用任务管理器终止进程时,它会调用 Win32 TerminateProcess 函数,它无条件地强制进程(包括其拥有的所有线程)退出。暂停所有线程/进程的执行,并取消所有挂起的 I/O 请求。你的程序实际上已经死了。 TerminateProcess函数不会调用 CLR 提供的关闭序列,因此您的托管应用程序甚至不知道正在关闭。

您建议您在应用程序的进程终止时关注处理对象,但这里有几点值得指出:

  • 始终努力将可能造成的损害降至最低。尽快处理您的元素,无论何时您用完它们。不要等到以后。在任何给定时间,当您的程序进程终止时,您应该只保留最少数量的对象,这将减少泄漏的可能性。
  • 操作系统通常会在终止时清理并释放大部分资源(即句柄等)。
  • 最后,不用说,以这种方式终止进程确实是一种异常(exception)情况——即使某些资源泄漏,这也是意料之中的。您不应该以这种方式关闭应用程序,就像您不应该杀死必要的 Windows 系统进程一样(即使以管理员身份运行时可以这样做)。

  • 如果这是您关闭控制台应用程序的常规计划,你需要找另一个计划 .

    关于.net - 管理 .NET 应用程序以在终止/终止时正常关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4266489/

    相关文章:

    linux - 可以使用 "kill"作为结束进程的标准方式吗?

    Python - 杀死挂起的进程开始使用 subprocess.Popen

    sql-server - SQL Server : Kill Process using Stored Procedure

    c# - 在使用中包装 MemoryStream

    c# - .Net 类库中的可访问性

    linux - 在 Go 中设置进程名称(如 `ps` 所示)

    ruby - 如何在单独的进程中运行代码?

    c# - 具有参数条件的简单工厂,使用 Unity 2.0

    c# - 具有一对一关系的 EF Core 批量插入

    linux - 为什么进程之间不能直接通信?