Рассмотрим это чрезвычайно простое приложение .NET Core 3.1 (и .NET 5) без специальной конфигурации или размещенных служб:
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
internal class Program
{
public static async Task Main(string[] args)
{
var builder = Host.CreateDefaultBuilder(args);
builder.UseWindowsService();
var host = builder.Build();
var fireAndforget = Task.Run(async () => await host.RunAsync());
await Task.Delay(5000);
await host.StopAsync();
await Task.Delay(5000);
await host.RunAsync();
}
Первый запуск (отправленный как фоновый запуск и задача «забыть» только для целей этого теста) и остановка завершаются успешно. При повторном вызове Run я получаю следующее исключение:
System.AggregateException: 'Имя объекта:' EventLogInternal '. Невозможно получить доступ к удаленному объекту. Имя объекта: 'EventLogInternal'.) '
Если я сделаю то же самое, но использую StartAsync вместо RunAsync (на этот раз нет необходимости в fireAndForget), я получаю System.OperationCanceledException
при вызове StartAsync во второй раз.
Правильно ли я заключил, что .NET Generic Host не предназначен для остановки и перезапуска?
Зачем мне это нужно?
Моя цель - иметь одно приложение, работающее как службу Windows, на котором размещались бы два разных .NET Generic Host. Это основано на рекомендации здесь, чтобы иметь отдельную конфигурацию и правила внедрения зависимостей и очереди сообщений.
Один будет оставаться активным в течение всего времени существования приложения (до тех пор, пока служба не будет остановлена в службах Windows) и будет служить точкой входа для получения событий сообщений, которые будут запускать / останавливать другой, который будет основным узлом обработки с полными службами. Таким образом, основные службы могут находиться в состоянии ожидания, пока не получат сообщение, запускающее их процесс, а другое сообщение может вернуть их в состояние ожидания.