Я пытался следовать рекомендациям здесь для создания службы Windows с использованием Microsoft.Extensions.Hosting.WindowsServices
. Пока все хорошо, все работает нормально, мой фоновый сервис ExecuteAsync
вызывается, и журнал говорит, что все в порядке. Запуск приложения в виде консольного приложения также работает нормально, я могу запустить его, сделать все, что мне нужно, а затем остановить его.
Однако затем я пытаюсь установить службу Windows, используя:
sc create myservice binPath= "\"<path-to-the-exe-file>\" service" start= auto DisplayName= "My Service"
Я получаю [SC] CreateService SUCCESS
. Но когда я пытаюсь запустить службу вручную, она говорит мне, что она не ответила своевременно. Опять же, журнал в порядке, без ошибок. Средство просмотра событий больше ничего не говорит мне о том, что может пойти не так, и я понятия не имею, что я могу сделать дальше, чтобы найти причину проблемы.
Вот примерный код, который я использовал для настройкиhost:
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;
}
}