我尝试遵循建议here使用microsoft.Extensions.Hosting.WindowsServices
创建Windows服务。到目前为止,一切正常,我的后台服务的ExecuteAsync
被调用,日志显示一切正常。作为控制台应用程序启动该应用程序也可以正常工作,我可以启动它,做我需要做的一切,然后停止它。
但是,我尝试使用以下方法安装Windows服务:
sc create myservice binPath= "\"<path-to-the-exe-file>\" service" start= auto DisplayName= "My Service"
我得到[SC] CreateService SUCCESS
。但是,当我尝试手动启动该服务时,它告诉我它没有及时响应。同样,日志很好,没有错误。事件查看器仅告诉我它可能会出错,并且我不知道下一步该怎么做才能找到问题的原因。
这是我用来配置主机的近似代码:
var containerBuilder = new ContainerBuilder();
IContainer container = null;
var hostBuilder = Host.CreateDefaultBuilder(appArgs);
hostBuilder
.UseServiceProviderFactory(new CustomAutofacServiceProviderFactory(() => container))
.ConfigureServices(services =>
{
services.AddHostedService<BackgroundWorker>();
containerBuilder.Populate(services);
container = containerBuilder.Build();
})
.UseWindowsService();
这是我用于后台服务的类。
public class BackgroundWorker : BackgroundService
{
private readonly IAppContext appContext;
private CancellationTokenRegistration stopRegistration;
public BackgroundWorker(ILogger<BackgroundWorker> logger,IAppContext appContext)
{
this.Logger = logger;
this.appContext = appContext;
}
public ILogger<BackgroundWorker> Logger { get; }
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
this.Logger.Info("Background worker started.");
this.stopRegistration = stoppingToken.Register(() =>
{
this.Logger.Info("Background worker stopping...");
this.stopRegistration.Dispose();
this.Logger.Info("Background worker stopped.");
});
return Task.CompletedTask;
}
}