async/await が使用されていなくても、サービス呼び出しがプールされ、非同期で実行される可能性はありませんか?
いいえ。ConcurrencyMode.Multiple
複数のスレッドが同時に呼び出しを実行することを許可しますが、それは非同期処理と同じではありません。
単一の同期リクエストを考えてみましょう。単一のスレッドがリクエストを受け取り、完了するまでそれを実行します。そのスレッドがブロックする場合、その要求が完了するのを待っているブロックされたスレッドがあります。ConcurrencyMode.Multiple
他のリクエストをブロックせずに、他のスレッドが入ってきて他の呼び出しを行うことを許可するように指定できます。
ここで、単一の非同期リクエストを考えてみましょう。単一のスレッドがリクエストを受け取り、実行を開始します。ブロックする代わりに、そのスレッドは "待機" し、非同期操作が完了するまでスレッドをスレッド プールに返します。これは、そのリクエストにブロッキング スレッドがないことを意味します。メソッドが の後に再開するawait
と、スレッド プールの一部のスレッドが要求を続行するために使用されます (最終的に、それらのスレッドの 1 つが要求を完了します)。
肝心async
なのは、非同期操作はスレッドよりもオーバーヘッドが少ないため、サーバー側では同期コードよりも大きなスケールが可能になるということです。
ConcurrencyMode
別の質問を扱います。それは、サービスの実装がどの程度スレッドセーフであるかに関するものです。複数の呼び出しを同時に行うことができる場合は、 を指定する必要がありますConcurrencyMode.Multiple
。自然に非同期操作がある場合は、それらをasync
. また、スレッドセーフで本来非同期である場合は、両方を行う必要があります。