1. ホーム
  2. c#

[解決済み] ASP.NET Web APIでのasync/awaitの効果的な使い方

2022-06-27 18:37:23

質問

私は async/await 機能を使用しようとしています。私は、それが私のWeb APIサービスのパフォーマンスに違いをもたらすかどうか、あまり確信していません。以下は、私のアプリケーションのワークフローとサンプルコードです。

ワークフローです。

UIアプリケーション → Web APIエンドポイント(コントローラ) → Web APIサービス層のメソッド呼び出し → 別の外部Webサービス呼び出し。(ここではDBとのやり取りなど)

コントローラです。

public async Task<IHttpActionResult> GetCountries()
{
    var allCountrys = await CountryDataService.ReturnAllCountries();

    if (allCountrys.Success)
    {
        return Ok(allCountrys.Domain);
    }

    return InternalServerError();
}

サービス層です。

public Task<BackOfficeResponse<List<Country>>> ReturnAllCountries()
{
    var response = _service.Process<List<Country>>(BackOfficeEndpoint.CountryEndpoint, "returnCountries");

    return Task.FromResult(response);
}

私は上記のコードをテストし、動作しています。しかし、私はそれが正しい使用法であるかどうかわからない async/await . あなたの考えを共有してください。

どのように解決するのですか?

<ブロッククオート

私のAPIのパフォーマンスに違いが出るかどうか、あまり自信がありません。

サーバーサイドの非同期コードの主な利点は以下の通りであることを心に留めておいてください。 スケーラビリティ . 非同期コードは魔法のようにリクエストを高速に実行できるわけではありません。私はいくつかの "を使用する必要があります。 async を使うべきかを検討します。 に関する記事で async ASP.NET .

あなたの使用例(他のAPIを呼び出す)は非同期コードに適していると思いますが、「非同期」=「速い」ではないことに留意してください。最善の方法は、まず UI レスポンシブで非同期なものにすることです。 を感じることができます。 を速くすることができます。

コードを見る限りでは、これは非同期ではありません。

public Task<BackOfficeResponse<List<Country>>> ReturnAllCountries()
{
  var response = _service.Process<List<Country>>(BackOfficeEndpoint.CountryEndpoint, "returnCountries");
  return Task.FromResult(response);
}

のスケーラビリティの利点を得るには、本当に非同期な実装が必要です。 async :

public async Task<BackOfficeResponse<List<Country>>> ReturnAllCountriesAsync()
{
  return await _service.ProcessAsync<List<Country>>(BackOfficeEndpoint.CountryEndpoint, "returnCountries");
}

または(この方法のロジックが本当にただのパススルーである場合)。

public Task<BackOfficeResponse<List<Country>>> ReturnAllCountriesAsync()
{
  return _service.ProcessAsync<List<Country>>(BackOfficeEndpoint.CountryEndpoint, "returnCountries");
}

このように、quot;outside in" よりも "inside out" から作業する方が簡単であることに注意してください。言い換えれば、非同期なコントローラアクションから始めて、下流のメソッドを強制的に非同期にすることはありません。代わりに、自然に非同期になる操作(外部APIの呼び出し、データベースへの問い合わせなど)を特定し、それらを 最低 レベルで非同期化します ( Service.ProcessAsync ). 次に async を徐々に上げていき、最後のステップとしてコントローラのアクションを非同期化します。

また、どのような場合であっても Task.Run を使うべきではありません。