有没有办法正常关闭 DOCKER 中运行的 DOTNET CORE 应用程序?如果是的话,我应该听哪个活动?
我想要的只是取消请求我想将我的取消令牌传递给当前的方法,并在他们工作时推迟关闭。
寻找与dotnet核心相关的示例代码,参考链接等,而不是通用信息
更新 此问题与docker container exits immediately even with Console.ReadLine() in a .net core console application不重复,因为我没有立即退出问题。我需要利用Windows.SystemsEvents.SessionEnding这样的事件并依赖
select AVG(datediff(date2, date1)) from table group by year(date1), month(date1);
和/或实施Console.CancelKeyPress
并不适合该法案。
答案 0 :(得分:7)
在.NET Core 2.0中,您可以使用AppDomain.CurrentDomain.ProcessExit
事件,该事件在Docker中的Linux上运行良好。 AssemblyLoadContext.Default.Unloading
可能也适用,甚至在.NET Core 2.0之前。
答案 1 :(得分:4)
System.Console有一个名为CancelKeyPress的事件。我相信当sigint事件传递到dotnet时会被触发。
System.Console.CancelKeyPress += (s,e) => { /* do something here */};
答案 2 :(得分:2)
使用 2.0.0-preview2-006497 我做了一些测试,现在当Docker将SIGTERM / SIGINT发送到容器时会触发 AssemblyLoadContext.Default.Unloading
示例代码如下:
System.Runtime.Loader.AssemblyLoadContext.Default.Unloading += ctx =>
{
// code here...
};
有关详细信息,请参阅此问题:https://github.com/aspnet/Hosting/issues/870
答案 3 :(得分:1)
如果您的容器在Linux中运行,那么Loader.AssemblyLoadContext.Default.Unloading
可以工作,因为它可以捕获SIGTERM信号,但是Windows没有相应的机制(variable variables)。以下是使用SetConsoleCtrlHandler
namespace Routeguide
{
using System;
using System.Threading;
...
class Program
{
[DllImport("Kernel32")]
internal static extern bool SetConsoleCtrlHandler(HandlerRoutine handler, bool Add);
internal delegate bool HandlerRoutine(CtrlTypes ctrlType);
internal enum CtrlTypes
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT,
CTRL_CLOSE_EVENT,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT
}
static void Main(string[] args)
{
// do the server starting code
Start();
....
var shutdown = new ManualResetEvent(false);
var complete = new ManualResetEventSlim();
var hr = new HandlerRoutine(type =>
{
Log.Logger.Information($"ConsoleCtrlHandler got signal: {type}");
shutdown.Set();
complete.Wait();
return false;
});
SetConsoleCtrlHandler(hr, true);
Console.WriteLine("Waiting on handler to trigger...");
shutdown.WaitOne();
Console.WriteLine("Stopping server...");
// do the server stopping code
Stop();
complete.Set();
GC.KeepAlive(hr);
}
}
}
来处理Windows中的关机通知的答案
{{1}}