【发布时间】:2019-08-09 16:50:36
【问题描述】:
鉴于以下使用通用主机的 .NET Core 2.2 控制台应用程序:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace SimpleGenericHost
{
class SimpleHostedService : IHostedService
{
public Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("Service started");
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("Service stopped");
return Task.CompletedTask;
}
}
class Program
{
static async Task Main(string[] args)
{
var host = new HostBuilder()
.ConfigureServices(services =>
{
services.AddHostedService<SimpleHostedService>();
})
.Build();
var runTask = host.RunAsync();
await Task.Delay(5000);
await host.StopAsync();
await runTask;
}
}
}
当你运行它时,输出如下:
Service started
Application started. Press Ctrl+C to shut down.
Hosting environment: Production
Content root path: C:\projects\ConsoleApps\SimpleGenericHost\bin\Debug\netcoreapp2.2\
Service stopped
Service stopped
如您所见,SimpleHostedService.StopAsync 被调用了两次。为什么?
这是预期的吗?我错过了什么吗?是否有其他方法可以阻止只调用一次 IHostedService.StopAsync 的主机?
【问题讨论】:
-
StartAsync 和 StopAsync 都由框架本身调用。您不必手动调用它们
-
@Alberto。如果我需要通过键入 ctrl + c 或发送 SIGTERM 以外的其他方式停止主机怎么办?