ASP.Netコアを探検3.0シリーズ4:あなたはASP.NETコア3.0でアプリケーションを起動したときに非同期タスクを実行しています

はじめに:この記事では、私はASP.NETコア3.0ウェブホスト小さな変更は、アプリケーションの起動時に使用IHostedServiceがより簡単に非同期タスクを実行するようにする方法を説明します。

 

 

ASP.NETコア3.0を探求シリーズ:新しいプロジェクトファイルでProgram.csと一般的なホスト

ASP.Netコア3.0シリーズIIも見てみようStartup.csのASP.Netコア3.0を語ります

ASP.Netコアを探検3.0シリーズ3:ASP.Netコア3.0サービスプロバイダの検証

ASP.Netコアを探検3.0シリーズ5:IHostLifetimeを導入し、開始ジェネリックホストを明確に相互作用

ASP.Netコア3.0シリーズ六おすすめ情報ASP.NETコア3.0の新機能は、構造化されたログ情報を開始します

アプリの起動時に非同期タスクを実行しています

例えば、データベースの移行を実行するために、強く型付けされた設定を確認またはキャッシュを埋める - あなたがしたいかもしれない多くの理由があります。残念ながら、2.xの中で、この目的のために、組み込みのASP.NETコアプリミティブのいずれかを使用することはできません。

  • 同期API IStartupFilterので、私たちは、非同期を同期する必要があります。
  • IApplicationLifetime同期API、およびサーバは、要求の処理を開始した後ApplicationStartedイベントをトリガします。
  • IHostedServiceは、非同期APIを使用して、サーバーの実装を開始した後、要求を処理し始めます。

代わりに、私は2つの可能な解決策を提案します:

  • ウェブホストを構築する前に、しかし、実行した後に手動タスク。
  • サーバーを開始する前に、サーバがタスクの実行を開始するときIServerが実現カスタムを使用して、要求を受信します。残念ながら、このアプローチが問題となり得ます。

私たちは、もはやこれらのソリューションを必要としない、と恐れることなくIHostedServiceを使用することができます - 使用ASP.NETコア3.0は、ウェブホストのコードは、小さな変化が大きな違いを生むだろう作ります!

 

ASP.NETコア2.xでは、あなたは、バックグラウンドで実行してIHostedServiceサービスを実現することができます。(ケストレルWebサーバーが開始された後、すなわち、)アプリケーションが要求を処理するために開始し、アプリケーションを閉じたときに停止した後、これらはすぐに開始します。

バックグラウンドタスクを実行するために - でASP.NETコア3.0では、IhostedServiceはまだ同じ機能を持っています。しかし、わずかな変化のウェブホストに、あなたは今、アプリケーションの起動時に自動的に非同期タスクを実行するために使用することができます。

 

 ウェブホストにASP.NETコア2.xから次の行を変更します。

パブリック クラスウェブホスト
{ 
    パブリック 仮想 非同期タスクStartAsync(CancellationToken cancellationToken = デフォルト
    { 
        // ...初期設定が
        待つ Server.StartAsync(hostingApp、cancellationToken).ConfigureAwait(); 

        // 火IApplicationLifetime.Started 
        _applicationLifetime?.NotifyStarted()。

        // 火IHostedService.Startは
        待つ _hostedServiceExecutor.StartAsync(cancellationToken).ConfigureAwait(偽の); 

        // ...残りのセットアップ
    } 
}

 

 3.0 ASP.Netコアを変更すると、次のとおりです。

パブリック クラスウェブホスト
{ 
    パブリック 仮想 非同期タスクStartAsync(CancellationToken cancellationToken = デフォルト
    { 
        // ...初期設定

        // 火IHostedService.Startを
        待つ _hostedServiceExecutor.StartAsync(cancellationToken).ConfigureAwait(); 

        // ...もっとセットアップを
        待つ Server.StartAsync(hostingApp、cancellationToken).ConfigureAwait(偽の); 

        // 火IApplicationLifetime.Started 
        _applicationLifetime?.NotifyStarted()。

        // ...残りのセットアップ
     }
}

あなたが見ることができるように、IHostedService.Startは今Server.StartAsync前に実行します。この変更は、あなたが今、非同期タスクを実行しているIHostedServiceを使用できることを意味します。

あなたは非同期タスクが完了するまで、アプリケーションの処理要求を遅らせることとします。そうでない場合、あなたは記事のこのシリーズのヘルスチェック方法最終製品を使用する場合があります。

 

第二に、使用IHostedServiceは、アプリが起動し、非同期タスクを実行するとき

 

私たちは、IHostedServiceを実装することにより、タスクを作成することができ、このインタフェースは、2つのメソッドが含まれています。

パブリック インターフェースIHostedService 
{ 
    タスクStartAsync(CancellationToken cancellationToken)。
    タスクStopAsync(CancellationToken cancellationToken)。
}

 

あなたが要求を受信する前に実行したい任意のコードがStartAsync方法を配置する必要があります。このケースでは、StopAsyncメソッドを無視することができます。

アプリケーションが非同期EFコアの移行を実行するために開始したときにたとえば、次のタスクが起動します。 

パブリック クラスMigratorHostedService:IHostedService 
{ 
    // 私たちは、IServiceProviderを注入する必要があるので、私たちが作成することができます 
     // スコープサービス、MyDbContext 
    プライベート 読み取り専用IServiceProvider _serviceProviderを。
    公共MigratorHostedService(IServiceProviderサービス・プロバイダ)
    { 
        _serviceProvider = サービス・プロバイダ。
    } 

    公共の 非同期タスクStartAsync(CancellationToken cancellationToken)
    { 
        // スコープのサービスを取得するために、新しいスコープを作成して
        使用してVARの範囲を=_serviceProvider.CreateScope())
        { 
            // 取得DbContextインスタンス
            VAR myDbContext = scope.ServiceProvider.GetRequiredService <MyDbContext> (); 

            // 移行を行い非同期
            待つ)(myDbContext.Database.MigrateAsyncを。
        } 
    } 

    // NOOP 
    パブリックタスクStopAsync(CancellationToken cancellationToken)=> Task.CompletedTask。
}

 アプリケーションが要求の受信を開始する前に、タスクの依存性注入容器に追加して、実行を許可するには、AddHostedService <>拡張メソッドを使用します。

パブリック クラス起動
{ 
    公共 ボイドConfigureServices(IServiceCollectionサービス)
    { 
        // 他のDI構成 
        services.AddHostedService <MigratorHostedService> (); 
    } 

    公共 ボイド設定(IApplicationBuilder)
    { 
        // ...ミドルウェア構成
    } 
}

これらのサービスは、後にサービスが起動した後、起動時に実行されるConfigureServicesに添加されるDIコンテナに応じて実行の順序に追加されます。

 

 

第三に、要約

この記事では、私がどのようにアプリケーションが起動するときに、より簡単に非同期タスクを実行するためにあなたを可能にするために、ASP.NETコア3.0ウェブホストの小さな変化を説明しました。ASP.NETコア2.xでは、それは理想的な選択肢ではありませんが、変更はあなたがその役割を果たして3.0 IHostedServiceを使用できることを意味します。

 

 

翻訳:アンドリュー・ロック    https://andrewlock.net/running-async-tasks-on-app-startup-in-asp-net-core-3/

 

著者:郭鄭

出典:のhttp://www.cnblogs.com/runningsmallguo/

この記事では、著者とブログパークの合計に属し転載を歓迎しますが、この節で宣言され、著者の同意なしに保持され、見かけ上の位置にある元の記事のページへのリンクを指定する必要があります。

おすすめ

転載: www.cnblogs.com/runningsmallguo/p/11617238.html