[解決済み] ASP.NET Web APIでのasync/awaitの効果的な使い方
質問
私は
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
を使うべきではありません。
関連
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
-
[解決済み] await/asyncを使用しているときにHttpClient.GetAsync(...)が返らない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み] 関数を終了するには?
-
[解決済み】同期接続にHttpClientを使用する理由