1

次の WCF サービスがあるとします。

[ServiceBehavior(
    IncludeExceptionDetailInFaults = true, 
    InstanceContextMode = InstanceContextMode.Single,
    ConcurrencyMode = ConcurrencyMode.Multiple,
    UseSynchronizationContext = false)]

この実装でサービス操作に async/await パターンを使用すると、どのような違いがありますか? async/await が使用されていなくても、サービス呼び出しがプールされ、非同期で実行される可能性はありませんか? 多くの msdn およびブログ記事を読んだ後でも、上記のシナリオはまだ明確ではなく、安全のために操作を非同期化します。

4

1 に答える 1

6

async/await が使用されていなくても、サービス呼び出しがプールされ、非同期で実行される可能性はありませんか?

いいえ。ConcurrencyMode.Multiple複数のスレッドが同時に呼び出しを実行することを許可しますが、それは非同期処理と同じではありません。

単一の同期リクエストを考えてみましょう。単一のスレッドがリクエストを受け取り、完了するまでそれを実行します。そのスレッドがブロックする場合、その要求が完了するのを待っているブロックされたスレッドがあります。ConcurrencyMode.Multiple他のリクエストをブロックせずに、他のスレッドが入ってきて他の呼び出しを行うことを許可するように指定できます。

ここで、単一の非同期リクエストを考えてみましょう。単一のスレッドがリクエストを受け取り、実行を開始します。ブロックする代わりに、そのスレッドは "待機" し、非同期操作が完了するまでスレッドをスレッド プールに返します。これは、そのリクエストにブロッキング スレッドがないことを意味します。メソッドが の後に再開するawaitと、スレッド プールの一部のスレッドが要求を続行するために使用されます (最終的に、それらのスレッドの 1 つが要求を完了します)。

肝心asyncなのは、非同期操作はスレッドよりもオーバーヘッドが少ないため、サーバー側では同期コードよりも大きなスケールが可能になるということです。

ConcurrencyMode別の質問を扱います。それは、サービスの実装がどの程度スレッドセーフであるかに関するものです。複数の呼び出しを同時に行うことができる場合は、 を指定する必要がありますConcurrencyMode.Multiple。自然に非同期操作がある場合は、それらをasync. また、スレッドセーフ本来非同期である場合は、両方を行う必要があります。

于 2012-11-13T15:21:06.380 に答える