我的工作进程是一个.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)
在.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将阻塞,直到主机终止.您可以使用Start或StartAsync启动服务,并保持加工例如控制台输入或外部命令.当需要终止应用程序时,例如响应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)
当然,这可以用于更强大的东西,比如从端口上的命令中侦听
| 归档时间: |
|
| 查看次数: |
2550 次 |
| 最近记录: |