代码之家  ›  专栏  ›  技术社区  ›  lmcarreiro

在ASP.NET核心中启动/运行通用主机的这些方法有什么区别?

  •  4
  • lmcarreiro  · 技术社区  · 6 年前

    Microsoft.Extensions.Hosting 接口 IHost IHostBuilder

    我知道使用 async sync Run Start 以及拜访 IHostBuilder vs呼叫 I主机 ?

    // 1 , // 2 // 3 // 4 在下面的代码中:

    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace MyNamespace
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                IHostBuilder builder = CreateBuilder();
    
                // 1 - Call Run on the builder (async)
                await builder.RunConsoleAsync();    // extension method
    
                // 2 - Call Start on the builder (sync)
                builder.Start();                    // extension method
    
                IHost host = builder.Build();       // Call Build on the builder to get a host
    
                // 3 - Call Run on the host (sync / async)
                host.Run();                         // extension method
                await host.RunAsync();              // extension method
    
                // 4 - Call Start on the host (sync / async)
                host.Start();                       // extension method
                await host.StartAsync();            // class method
            }
    
            private static IHostBuilder CreateBuilder() => new HostBuilder()
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    //...
                })
                .ConfigureLogging((hostingContext, logging) => {
                    //...
                })
                .ConfigureServices((hostContext, services) =>
                {
                    //...
                    services.AddSingleton<IHostedService, MyService>();
                });
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  15
  •   Alex Riabov Vikrant    6 年前

    //1-在生成器上运行调用(异步)

    RunConsoleAsync启用控制台支持,构建并启动主机,并等待Ctrl+C/SIGINT或SIGTERM关闭。因此,正如它的名字所预期的那样,它只用于在控制台中托管你的应用程序(而不是IIS等)

    //2-调用生成器启动(同步)

    只是同步启动主机

    public static IHost Start(this IHostBuilder hostBuilder)
    {
        var host = hostBuilder.Build();
        host.StartAsync(CancellationToken.None).GetAwaiter().GetResult();
        return host;
    }
    

    RunAsync运行应用程序并返回在触发取消令牌或关机时完成的任务。 同步只是一个包装:

    public static void Run(this IHost host)
    {
        host.RunAsync().GetAwaiter().GetResult();
    }
    

    //4-在主机上启动调用(同步/异步)

    这个方法实际上是在启动程序,并最终从任何其他方式调用它。

        2
  •  14
  •   gregmac    4 年前

    为.NET Core 3.1更新。

    摘要

    • 起点 方法启动服务,并返回
    • 同步版本都只是实际异步实现的包装器( .GetAwaiter().GetResult(); )

    开始同步

    Task IHost.StartAsync(CancellationToken cancellationToken = default);
    

    起点

    void Start(this IHost host);
    

    IHost.StartAync();

    Task RunAsync(this IHost host, CancellationToken token = default)
    {
        using (host)
        {
            await host.StartAsync(token);
            await host.WaitForShutdownAsync(token);
        }
    }
    

    启动主机。任务在主机关闭时完成,可以通过取消令牌或调用 StopAsync() 在另一个线程上。

    Task WaitForShutdownAsync(this IHost host, CancellationToken token = default)
    

    返回在应用程序关闭时完成的任务。关机是通过传递的令牌启动的,取消令牌会导致应用程序停止。

    等待关机

    void WaitForShutdown(this IHost host)
    

    同步包装到 IHost.WaitForShutdownAync();

    停止异步

    Task IHost.StopAsync(CancellationToken cancellationToken = default)
    

    优雅地停止主机,在主机停止后返回一个完成的任务。取消 cancellationToken 表示停止不再优雅。

    还有一个扩展方法允许传递 Timeout 取而代之的是:

    public static Task StopAsync(this IHost host, TimeSpan timeout)
        => host.StopAsync(new CancellationTokenSource(timeout).Token);