2017-02-04 39 views
5

.NET çekirdeğini taşıyorum ve varolan uygulama, açık veritabanı dosyalarını ve diğer düzenli kapatma görevlerini temiz bir şekilde kapatabilmek için uygulamayı kapatmak üzere win32 çağrısı SetConsoleCtrlHandler'ı bağladı.Dotnet çekirdek yakalama kapatılması için yakın kapat

Aynı şeyi .NET çekirdeğinde yapmam gerekiyor ve görebildiğim tek seçenek, IApplicationLifetime ApplicationStopping.Register'a bağlanarak ASP.NET ile. Bununla birlikte, sadece Ctrl-C'yi yakalar ve son kullanıcı veya sistem konsol uygulaması (örn. Sistem yeniden başlatma) sonlandırırsa, win32 çağrısının yapacağı şekilde çalışmaz.

Diğer seçenek, AppDomain (AppDomain.CurrentDomain.ProcessExit) yoluyla yapılır, ancak AppDomain, dotnet Core'da kullanılamaz.

Düzenli uygulama kapatma önemlidir ve üretim sistemindeki veri bozulmasından endişeleniyorum, bu nedenle eşdeğer bir şeyleri uygulamaya koymanız gerekiyor ve yeni uygulama Windows ve Linux işletim sistemlerinde çalışacak.

Bunu yapmak için dotnet core'de bir işlevi özledim mi? Ya da win32 kapatma kancasını ve Linux'taki eşdeğeri ne olursa olsun yeniden uygulamak zorunda mıyım?

+0

Bunu en iyi nasıl uygulayacağınıza dair herhangi bir fikri olan var mı? – deandob

cevap

2

AppDomain.CurrentDomain.ProcessExit olayı artık .NET Core 2.0'da kullanılabilir ve bunun Linux üzerinde iyi çalıştığını doğrulayabiliriz. .NET Core 2.0, AssemblyLoadContext.Default.Unloading'dan önce muhtemelen bir çalışma alternatifi.

+1

Ancak, aklınızda bulundurun bu fikir, ama aynı zamanda [bazı meseleler] vardır (https://github.com/dotnet/coreclr/issues/8565). – quetzalcoatl