3

asp.Net MVCまたはAsp.Net Web APIで、async/awaitパターンを使用するようにデータベースにクエリするすべてのコントローラアクション(最も単純なクエリでも)を実行することをお勧めしますか?すべてのEntity Frameworkメソッドで非同期を使用する必要がありますか?

私は知っているasync/awaitは複雑さを追加しますが、それを追加する価値はありますか?最も単純なクエリの場合でも?

+0

理論的には:はい。すべてのDBコールがIOバインドであるため、スレッドをブロックします。しかし実際には、WebサービスやWebアプリケーションのトラフィック量が十分にある場合にのみ、それに見合った複雑さが増します。 – Dai

+0

交通量に関するものではありません。それはスレッドが希少なリソースになり、通常は十分です。ほとんどの場合スループットが向上し、非同期データベースアクセスを使用するようになります。 – usr

答えて

7

Entity Frameworkはデータベースを使用し、データベースサーバーにアクセスする必要があります。 EFを使用すると、データベースサーバーを接続し、サーバーが要求に応答するまで待つ必要があります。

アプリケーションがディスクまたはネットワーク(データベースへのアクセスなど)を読み取り/書き込みする場合は、I/O操作を実行しています。あらゆるI/O操作では、EF6が使用できる多くの非同期操作を公開するasync/awaitパターンを使用することをお勧めします。

I/Oバウンドは、 計算が周期によって主に決定される完了するのにかかる時間を完了するための入力/出力操作のため 待機に費やされている状態を指します。 出典:ウィキペディア

いくつかの精度:

各ASP.NetのWeb APIリクエストは、.NET Frameworkのスレッドプールで与えられたスレッドを使用しています。 ASP.Net Web APIアクションに同期メソッドを使用すると、入出力バインド操作(データベースアクセス)によってスレッドがブロックされ、データベースが応答するまで待機します。あなたの要求によって使用されたスレッドはブロックされ、スレッドプールに返されません。

トレッドプールで使用される最大スレッドは5000(.Net 4.5)です。アプリケーションが大規模なアプリケーションの場合は、最大限に高速に到達することができます。スレッドプールでスレッドが利用できない場合、新しい要求がキューに追加されます。サーバーキューがいっぱいになると、HTTP 503ステータスが"サーバーがビジー状態"の要求を拒否します。

ASP.Net Web APIアクションがasync/awaitパターンを使用している場合、各I/Oバインド操作は現在の要求のスレッドを解放します。このスレッドは、別の要求によって使用できます。 I/Oバウンド操作がそのタスクを終了すると、残りのASP.Net Web APIアクション・メソッドを処理する別のスレッドが与えられます。

あなたの疑問にお答えします。アプリケーションに多数の同時実行性がある場合は、データベースへのアクセスが必要なASP.Net Web APIのすべてのアクションで、async/awaitパターンを使用する必要があります。アプリケーションがより大きなアプリケーションではない場合でも、I/Oバウンド操作のためにasync/awaitを使用することが常に推奨されます。

これはarticleです。 ASP.Net MVCの「非同期メソッドの使用」について説明していますが、ASP.Net Web APIには、推奨事項の大部分を使用できます。

+0

はい、あなたは正しいです。私は長い時間かかる複雑なクエリのための非同期の使用を検討する必要がありますか? asyncを使用していると複雑さが増していますか? – Kahbazi

+0

@Arvin I/Oバウンド操作は、長時間実行される操作ではなく、多くのCPUを消費することなくスレッドをブロックする読み取り/書き込みアクセスだけを意味します。私はより正確にasnwerを更新しました。 – CodeNotFound

+0

ありがとうございました。私の質問についてもっと学ぶことができる資料や参考資料はありますか? – Kahbazi

関連する問題