考虑这个没有特殊配置或托管服务的极其简单的 .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 通用主机不应该被停止和重新启动?
为什么我需要这个?
我的目标是让单个应用程序作为 Windows 服务运行,该服务将托管两个不同的 .NET 通用主机。这是基于此处的建议,以便拥有单独的配置和依赖注入规则以及消息队列。
一个将在所有应用程序生命周期内保持活动状态(直到服务在 Windows 服务中停止),并将用作接收消息事件的入口点,该消息事件将启动/停止另一个将是具有完整服务的主要处理主机。这样,主要服务可以处于“空闲”状态,直到它们收到触发其进程的消息,并且另一条消息可以将它们返回到空闲状态。