【问题标题】:Capture shutdown command for graceful close in .NET Core捕获关闭命令以在 .NET Core 中正常关闭
【发布时间】:2017-06-22 01:44:26
【问题描述】:

我正在移植到 .NET 核心,现有应用程序已挂钩 win32 调用 SetConsoleCtrlHandler 以捕获应用程序关闭,以便它可以干净地关闭打开的数据库文件和其他有序的关闭任务。

我需要在 .NET 核心中做同样的事情,我能看到的唯一选择是通过连接到 IApplicationLifetime ApplicationStopping.Register 来使用 ASP.NET。但是,这仅捕获 Ctrl-C 并且如果最终用户或系统终止 win32 调用将执行的控制台应用程序(例如系统重新启动)则不起作用。

另一个选项是通过 AppDomain (AppDomain.CurrentDomain.ProcessExit) 但 AppDomain 在 dotnet Core 中不可用。

有序的应用关闭很重要,我担心生产系统中的数据损坏,因此需要实现等效的东西,并且新应用将在 Windows 和 Linux 操作系统的混合上运行。

我是否错过了 dotnet core 中的一个函数来执行此操作?还是我必须重新实现 win32 关闭挂钩以及 Linux 上的任何等效项?

【问题讨论】:

  • 有人对如何最好地解决这个问题有任何想法吗?
  • 你当然不应该有任何打开的数据库文件。

标签: c# linux windows asp.net-core .net-core


【解决方案1】:

AppDomain.CurrentDomain.ProcessExit 事件现在在 .NET Core 2.0 中可用,我可以确认它在 Linux 上运行良好。在 .NET Core 2.0 之前,AssemblyLoadContext.Default.Unloading 可能是一个可行的替代方案。

【讨论】:

  • 但是,请记住,这就是想法,但也有some issues - 值得关注那个
【解决方案2】:

如果您可以更新到 dotnet core 2.1(或更高版本),您应该考虑将 IHost 接口用于控制台应用程序,将 IHostedService 用于 asp.net 核心应用程序(2.0 及更高版本),这些应用程序专为此类应用而设计事情 - 告诉框架你有后台进程需要在关机时得到通知。

更多信息https://blogs.msdn.microsoft.com/cesardelatorre/2017/11/18/implementing-background-tasks-in-microservices-with-ihostedservice-and-the-backgroundservice-class-net-core-2-x/

诚然,您可能还需要 AppDomain.CurrentDomain.ProcessExit 来处理被终止进程的情况,但使用 IHost/IHostedService 可以让您在大多数应用程序关闭时有更多时间进行正常关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多