考虑这个非常简单的.NET Core 3.1(和.NET 5)应用程序,没有特殊的配置或托管服务:
第一次运行(仅作为后台“fire and forget”任务发送,仅用于此测试目的)和停止成功。在第二次调用Run时,我收到了以下异常:
System.AggregateException:“对象名称:'EventLogInternal'。无法访问已处理的对象。对象名称:'EventLogInternal'。”
如果我使用StartAsync而不是RunAsync执行相同的操作(这次不需要fireAndForget),则在第二次调用StartAsync时会收到System.OperationCanceledException。
我是否可以推断出.NET通用主机不适合停止和重新启动?
其中一个服务会在应用程序的整个生命周期内保持活动状态(直到在Windows服务中停止该服务),并作为接收消息事件的入口点,启动/停止另一个服务,后者将成为具有完整服务的主处理主机。这样,主要服务可以处于“空闲”状态,直到它们接收到触发其进程的消息,另一个消息可以将其返回到空闲状态。
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();
}
第一次运行(仅作为后台“fire and forget”任务发送,仅用于此测试目的)和停止成功。在第二次调用Run时,我收到了以下异常:
System.AggregateException:“对象名称:'EventLogInternal'。无法访问已处理的对象。对象名称:'EventLogInternal'。”
如果我使用StartAsync而不是RunAsync执行相同的操作(这次不需要fireAndForget),则在第二次调用StartAsync时会收到System.OperationCanceledException。
我是否可以推断出.NET通用主机不适合停止和重新启动?
我为什么需要这个?
我的目标是有一个单独的应用程序作为Windows服务运行,该应用程序将托管两个不同的.NET通用主机。这是基于here的建议,以便具有单独的配置和依赖注入规则以及消息队列。其中一个服务会在应用程序的整个生命周期内保持活动状态(直到在Windows服务中停止该服务),并作为接收消息事件的入口点,启动/停止另一个服务,后者将成为具有完整服务的主处理主机。这样,主要服务可以处于“空闲”状态,直到它们接收到触发其进程的消息,另一个消息可以将其返回到空闲状态。