c # - dotnet core capture shutdown for yndefuldt tæt

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg sender til. NET-kernen, og den eksisterende app har hooked win32-opkaldet SetConsoleCtrlHandler til at indfange applikationen tæt, så den kan lukke åben databasefiler og andre ordnede afbrydelsesopgaver.


Jeg skal gøre det samme i .NET kernen, og den eneste mulighed jeg kan se er med ASP.NET ved at tilslutte til IApplicationLifetime ApplicationStopping.Register. Men det optager kun Ctrl-C og virker ikke, hvis slutbrugeren eller systemet afslutter konsolappen (f.eks. System genstart) som win32-opkaldet vil.


Den anden mulighed er via AppDomain (AppDomain.CurrentDomain.ProcessExit), men AppDomain er ikke tilgængelig i dotnet Core.


Ordentlig afstengning af ordret er vigtigt, og jeg er bekymret for datakorruption i produktionssystemet, så jeg skal implementere noget tilsvarende, og den nye app kører på en blanding af Windows og Linux OS.


Har jeg savnet en funktion i dotnet kerne for at gøre dette? Eller skal jeg geninstallere win32 shutdown hook og hvad er ligestillingen på Linux?

Bedste reference


AppDomain.CurrentDomain.ProcessExit -hændelsen er nu tilgængelig i .NET Core 2.0, og jeg kan bekræfte, at det fungerer fint på Linux. Før .NET Core 2.0, AssemblyLoadContext.Default.Unloading er nok et fungerende alternativ.

Andre referencer 1


Hvis du kan opdatere til dotnet-kerne 2.1 (eller senere), bør du overveje at bruge IHost -grænsefladen til konsolapper og IHostedService til asp.net-kerneprogrammer (2,0 og opefter), der er designet til netop denne slags af ting - fortæller rammen har du baggrundsprocesser, der skal meddeles ved afbrydelse.


Flere oplysninger på https://blogs.msdn.microsoft.com/cesardelatorre/2017/11/18/implementing-background-tasks-in-microservices-with-ihostedservice-and-the-backgroundservice-class-net-core-2 -x/[6]


Du må muligvis også have AppDomain.CurrentDomain.ProcessExit til det dræbte processcenarie, men ved hjælp af IHost/IHostedService får du mere tid til en yndefuld nedlukning i de fleste applikationsafbrydelser.