gpt4 book ai didi

.net - 托管 .NET Core 控制台应用程序,例如 Windows 服务

转载 作者:行者123 更新时间:2023-12-04 15:55:49 24 4
gpt4 key购买 nike

我的工作进程是一个 .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();
}
}

最佳答案

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

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

主要方法可能如下所示:

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();
}

只要应用程序运行就需要运行的服务应该实现 IHostedService .这在 Background tasks with hosted services 中有描述。 .

UseConsoleLifetime() call 将主机配置为检查 Ctrl+C并终止应用程序。发生这种情况时,主机将调用 StopAsync实现 IHostedService 的任何已配置服务的方法界面。

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

您也可以调用 RunConsoleAsync()配置控制台生存期并启动服务,无需额外调用 UseConsoleLifetime() .
RunAsyncRunConsoleAsync将阻塞直到主机终止。您可以使用 StartStartAsync启动服务并继续处理,例如控制台输入或外部命令。当需要终止应用程序时,例如响应 exit输入,您可以调用 StopAsync .

例如 :
host.Start();

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

await host.StopAsync();

当然,这可以用于更重要的事情,比如监听端口上的命令

关于.net - 托管 .NET Core 控制台应用程序,例如 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51357799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com