.net core .NET通用主机-是否可以停止并重新启动主机?

.net core .NET通用主机-是否可以停止并重新启动主机?,.net-core,.net-5,microsoft.extensions.hosting,.net Core,.net 5,Microsoft.extensions.hosting,考虑一下这个极其简单的.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(ar

考虑一下这个极其简单的.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:'对象名称:'EventLoginInternal'。无法访问已处理的对象。对象名称:“EventLoginInternal”。)

如果我也这样做,但使用StartAsync而不是RunAsync(这次不需要fireAndForget),我将在第二次调用StartAsync时收到一个
System.OperationCanceledException

我推断.NET通用主机不应该停止并重新启动,对吗

为什么我需要这个? 我的目标是让一个应用程序作为Windows服务运行,它将承载两个不同的.NET通用主机。这是基于的建议,以便有单独的配置和依赖项注入规则以及消息队列


其中一个将在整个应用程序生命周期内保持活动状态(直到服务在Windows服务中停止),并将作为接收消息事件的入口点,该消息事件将启动/停止另一个应用程序,该应用程序将是具有完整服务的主处理主机。这样,主服务可能处于“空闲”状态,直到它们接收到触发其进程的消息为止,而另一条消息可能会将它们返回到空闲状态。

CreateDefaultBuilder(…).Build()返回的主机将代表整个应用程序。发件人:

将应用程序的所有相互依赖的资源包含在一个对象中的主要原因是生命周期管理:控制应用程序的启动和关闭

默认构建器在单例范围内注册许多服务,当主机停止时,所有这些服务都被释放或切换到某个“停止”状态。例如,在调用
StopAsync
之前,您可以解析
IHostApplicationLifetime

var appLifetime=host.Services.GetService();
它具有表示应用程序状态的取消令牌。停止后调用StartAsync或RunAsync时,所有令牌仍将
IsCancellationRequested
设置为
true
。这就是为什么会抛出
OperationCanceledException

您可以在配置期间列出其他服务:


对我来说,听起来你只是需要一些后台工作来处理消息,但我从来没有使用过NServiceBus,所以我不知道它如何与Hangfire这样的东西一起工作。您还可以实现
IHostedService
,并在通用主机生成器中使用它。

谢谢。因此,答案实际上是“不,IHost并不意味着在应用程序生命周期内停止和重新启动”。我的问题来自我使用的库的使用,它不是在ConfigureService中提供服务,而是通过IHostBuilder上的扩展方法来完成的。我会跟进他们。是的,简短的回答是“否”:。我只是不确定,并检查了源代码。从技术上讲,您可以在每次需要时构建主机,但这听起来有点过头了。仅供参考:即使每次构建新主机时都会在第二站出现
eventloginterlal
异常。使用ctrl+c触发应用程序关闭时也是如此。他们似乎真的不允许在同一个应用程序中使用多个IHost。