我需要通知systemd
我的服务已成功启动,并且启动后需要运行的任务要求服务器已在目标Unix域套接字上监听。
我正在使用IWebHost::Run
启动服务器,这是一个阻塞调用。此外,我无法找到任何明显的方法来设置委托或回调事件以成功初始化。
任何?
答案 0 :(得分:3)
在.Net Core 1.x
上运行IWebHost.Start()
是安全的,并假设服务器之后被初始化(而不是阻塞线程的Run()
)。查看source。
var host = new WebHostBuilder()
.UseKestrel()
(...)
.Build();
host.Start();
如果您正在使用.NET Core 2.0 Preview 1
(或更高版本),source is different,则同步方法不再可用,因此您应等待IWebHost.StartAsync()
并假设事后已准备就绪。
答案 1 :(得分:2)
您可以使用Microsoft.AspNetCore.Hosting.IApplicationLifetime:
/// <summary>
/// Triggered when the application host has fully started and is about to wait
/// for a graceful shutdown.
/// </summary>
CancellationToken ApplicationStarted { get; }
请查看此SO post以获取配置示例。
答案 2 :(得分:1)
这就是我最终的目标。似乎工作正常:
host.Start();
Log.Information("Press Ctrl+C to shut down...");
Console.CancelKeyPress += OnConsoleCancelKeyPress;
var waitHandles = new WaitHandle[] {
CancelTokenSource.Token.WaitHandle
};
WaitHandle.WaitAll(waitHandles);
Log.Information("Shutting down...");
然后,在Ctrl + C事件处理程序中:
private static void OnConsoleCancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
Log.Debug("Got Ctrl+C from console.");
CancelTokenSource.Cancel();
}
答案 3 :(得分:0)
这就是我为克服此问题所做的事情。
1-我注册了ApplicationStopped
事件。这样它就可以通过调用当前进程的Kill()
方法来终止应用程序。
public void Configure(IHostApplicationLifetime appLifetime) {
appLifetime.ApplicationStarted.Register(() => {
Console.WriteLine("Press Ctrl+C to shut down.");
});
appLifetime.ApplicationStopped.Register(() => {
Console.WriteLine("Terminating application...");
System.Diagnostics.Process.GetCurrentProcess().Kill();
});
}
See IHostApplicationLifetime docs
2-在构建主机时不要忘记使用UseConsoleLifetime()
。
Host.CreateDefaultBuilder(args).UseConsoleLifetime(opts => opts.SuppressStatusMessages = true);