dotnet core capture shutdown for graceful close

时间:2017-02-04 20:43:31

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

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

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

另一个选项是通过AppDomain(AppDomain.CurrentDomain.ProcessExit),但是在dotnet Core中没有AppDomain。

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

我是否错过了dotnet核心中的功能?或者我是否必须重新实现win32关闭钩子以及Linux上的等效物?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

如果您可以更新到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可以让您有更多时间进行正常关闭。