簡體   English   中英

這些在 ASP.NET Core 中啟動/運行通用主機的方法有什么區別?

[英]What's the difference between these ways to start/run a Generic Host in ASP.NET Core?

ASP.NET Core 中的托管設計現在有一個新的通用主機(.NET Core 2.1+),它將在未來取代 Web 主機。

有很多方法可以使用Microsoft.Extensions.Hosting接口IHostIHostBuilder來啟動應用程序。

我知道使用asyncsync之間的區別,但是所有這些選項之間有什么區別? 使用Run vs Start並調用IHostBuilder與調用IHost

請參閱以下代碼中的選項// 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>();
            });
    }
}

為 .NET 6 更新。

概括

  • 除了RunConsoleAsync之外,所有這些方法都在IHost實例上運行。 IHostBuilder上的那些只是調用IHost.Build()然后委托給IHost方法(例如IHostBuilder.StartAsync()等效於IHostBuilder.Build().StartAsync() )。
  • 啟動方法啟動主機並立即返回
  • Run方法啟動主機並等待它完成,然后再返回
  • 同步版本都只是實際異步實現( .GetAwaiter().GetResult() )的包裝。

方法

開始異步

Task IHost.StartAsync(CancellationToken cancellationToken = default)

啟動主機(Web 應用程序)。 主機啟動后任務完成。

開始

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()來觸發。

WaitForShutdownAsync

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);
  • RunConsoleAsync
Task RunConsoleAsync(this IHostBuilder hostBuilder, CancellationToken cancellationToken = default)
{
    return hostBuilder.UseConsoleLifetime().Build().RunAsync(cancellationToken);
}

這是一個奇怪的人,因為:

  • 它沒有針對IHost的相應實現
  • 它沒有對應的Start方法

查看該方法的實際代碼可以清楚地了解前者奇怪的原因,但我不確定后者。

// 1 - 在構建器上調用 Run(異步)

RunConsoleAsync 啟用控制台支持,構建和啟動主機,並等待 Ctrl+C/SIGINT 或 SIGTERM 關閉。 因此,正如其名稱所預期的那樣,它僅用於在控制台中托管您的應用程序(而不是 IIS 等)

// 2 - 在構建器上調用 Start(同步)

只是同步啟動主機

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

// 3 - 在主機上調用 Run(同步/異步)

RunAsync 運行應用程序並返回一個在觸發取消令牌或關閉時完成的任務。 Sync 只是一個包裝器:

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

// 4 - 在主機上調用開始(同步/異步)

這個方法實際上是在啟動程序,並且最終會從任何其他方式調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM