主机.NET Core控制台应用程序,如Windows服务

And*_*niy 3 .net .net-core

我的工作进程是一个.net核心控制台应用程序.我如何像Windows服务一样托管它?

因为在当前的实现中,我认为如果我把它打包成像nssm这样的东西,它会因为Console.ReadKey()而被卡住; 但我仍然需要处理停止事件.

public class Program
{
    private Program()
    {
    }

    public static void Main()
    {
        var services = new ServiceCollection();
        var startup = new Startup();
        startup.ConfigureServices(services);

        var serviceProvider = services.BuildServiceProvider();

        var workerService = serviceProvider.GetService<WorkerService>();


        workerService.Run();

        Console.WriteLine("Listening for messages. Hit any key to quit.");
        Console.ReadKey();

        workerService.Stop();
    }
}
Run Code Online (Sandbox Code Playgroud)

Pan*_*vos 8

在.NET Core 2.1中,您可以使用Generic Host类来创建和运行服务/守护程序,例如应用程序.

您可以使用与ASP.NET Core应用程序几乎相同的方式配置和运行应用程序.尽管有文章标题,但这并不是ASP.NET Core特有的,通用主机构建器是通过没有ASP.NET Core依赖性的Microsoft.Extensions.Hosting包部署的.

主要方法可能如下所示:

public static async Task Main(string[] args)
{
    var host = new HostBuilder()
        .UseConsoleLifetime()
        .ConfigureServices((hostContext, services) =>
        {
            services.AddLogging();
            services.AddHostedService<LifetimeEventsHostedService>();
            services.AddHostedService<TimedHostedService>();
        })
        .Build();

    await host.RunAsync();
}
Run Code Online (Sandbox Code Playgroud)

只要应用程序运行,需要运行的服务应该实现IHostedService.背景任务与托管服务中描述了这一点.

UseConsoleLifetime()调用配置主机检查Ctrl+C和终止应用程序.发生这种情况时,主机将调用实现该接口的任何已配置服务的StopAsync方法IHostedService.

RunAsync()被调用时会调用StartAsync实现IHostedService任何服务的方法.

您还可以调用RunConsoleAsync()来配置控制台生命周期并启动服务而无需额外调用UseConsoleLifetime().

RunAsync并且RunConsoleAsync将阻塞,直到主机终止.您可以使用StartStartAsync启动服务,并保持加工例如控制台输入或外部命令.当需要终止应用程序时,例如响应exit输入,您可以调用StopAsync.

例如 :

host.Start();

Console.WriteLine("Type exit or Ctrl+C to exit");
while(Console.ReadLine() !="exit")
{
    //..
}

await host.StopAsync();
Run Code Online (Sandbox Code Playgroud)

当然,这可以用于更强大的东西,比如从端口上的命令中侦听