5

すべてのリクエストを非同期にするために何かする必要がありますか、それとも自動的にそのように処理されますか?

いくつかのテストを実行したところ、各リクエストが独自のスレッドで受信されるように見えますが、テストが間違っている可能性があるため、質問することをお勧めします.

更新: (完全に説明しないという悪い癖があります - 申し訳ありません) ここに私の懸念があります。クライアント ブラウザは、http://data.domain/com/employee_database/?query=state:Coloradoのサーバーに REST リクエストを送信します。これは、コントローラーの適切なメソッドに入ります。そのメソッドはデータベースにクエリを実行し、JSON 構造に変換されて呼び出し元のアプリに返されるオブジェクトを返します。

ここで、10,000 のクライアントがすべて同じサーバーに対して同様のクエリを作成するとします。そのため、一度に 10,000 件のリクエストが届きます。コントローラー メソッドは 10,000 の異なるスレッドで同時に呼び出されますか? それとも、2 番目の要求が呼び出される前に、最初の要求が返される必要がありますか?

非同期コンポーネントを持つハンドラー メソッドのコードについて質問しているわけではありません。私の場合、リクエストは単一の SQL クエリになるため、コードには非同期に処理できるものは何もありません。そして、要求されたデータを取得するまで、メソッドから戻ることはできません。

4

4 に答える 4

2

あなたのケースでは、データベース呼び出しなどの非同期 IO/操作を使用する必要があると思います。はい、Web Api では、すべての要求に独自のスレッドがありますが、連続した要求が多数ある場合、スレッドが不足する可能性があります。また、スレッドはメモリを使用するため、あまりにも多くのリクエストが API にヒットすると、システムに圧力がかかる可能性があります。

同期よりも非同期を使用する利点は、システム リソースを賢く使用できることです。同期実装でデータベース呼び出しが完了するのを待っている間にスレッドをブロックする代わりに、非同期はスレッドを解放してより多くの要求を処理したり、プロセスがスレッドを必要とするものを割り当てたりします。IO (データベース) 呼び出しが完了すると、別のスレッドがそこから取得し、実装を続行します。IO 操作の完了に時間がかかる場合は、Async によって API の実行も高速になります。

于 2015-09-30T20:23:37.430 に答える
1

正直なところ、あなたの質問はあまり明確ではありません。を使用して HTTP GET を作成している場合はHttpClientGetAsyncメソッド、リクエストが発行され、レスポンスが返されるまで、スレッドでやりたいことを何でもできます。したがって、このリクエストは非同期です。この要求を処理するサーバー側について質問している場合 (ASP.NET Web API であると仮定)、非同期かどうかは Web API の実装方法次第です。アクション メソッドが 3 つのこと、たとえば 1、2、3 をブロック モードで同期的に次々に実行する場合、同じスレッドが要求にサービスを提供します。一方、上記の #2 は Web サービスへの呼び出しであり、HTTP 呼び出しであるとします。ここで、HttpClient を使用して非同期呼び出しを行うと、1 つの要求が複数のスレッドによって処理される状況になる可能性があります。そのためには、アクション メソッドから非同期で HTTP 呼び出しを行い、使用する必要があります。asyncキーワード。その場合、awaitアクション メソッド内で呼び出すと、アクション メソッドの実行が戻り、リクエストにサービスを提供しているスレッドが自由に他のリクエストにサービスを提供できるようになり、最終的にレスポンスが利用可能になると、同じスレッドまたは他のスレッドが元の場所から続行されます。以前に中断しました。長くて退屈な答えです。たぶん、タイピングして言葉だけで説明するのは難しいと思います。明確になることを願っています。

更新: アクション メソッドは10,000 スレッドで並列に実行されます (理想的には)。なぜ私が理想的だと言っているのかというと、10,000 のスレッドを持つ CLR スレッド プールは一般的ではなく、おそらく実用的でもないからです。フレームワークによって課される制限だけでなく、物理的な制限もありますが、あなたの質問に対する答えは、リクエストが並行して処理されるということだと思います。ここでの正しい用語は「並列」ですが、「非同期」ではありません。

于 2013-09-06T19:16:40.403 に答える
0

同期か非同期かはあなたの選択です。あなたはあなたの行動を書く方法によって選択します。Task を返し、内部で async IO も使用する場合、それは非同期です。それ以外の場合は同期です。

asyncあなたの行動を平手打ちして使用する誘惑に駆られないでくださいTask.Run。これが async-over-sync (既知のアンチパターン) です。OSカーネルに至るまで、完全に非同期でなければなりません。

フレームワークは同期 IO を自動的に非同期にすることができないため、内部で発生することはありません。Async IO はコールバック ベースであり、プログラミング モデルの大幅な変更です。

もちろん、これはあなたが何をすべきかには答えません。それは新しい質問でしょう。

于 2013-09-07T18:33:52.657 に答える