2016-11-29 9 views
0

同じことをする2つのコントローラ(意図的に非常に遅いネットワークコール)を持つ.Net Web APIを作成しました。 1つは同期し、1つは非同期です。非同期コードハンドルの負荷が軽いのはなぜですか?

var content = await client.DownloadStringTaskAsync(url); 

var content = client.DownloadString(url); 

非同期

同期: https://github.com/jkruer01/SyncVsAsync

2つのコントローラ間の重要な違いは、Webクライアントを使用してコードのこの一行は、次のとおりです。あなたはここにコードを見つけることができますかなり基本的なもの...

次に、コンソールアプリケーションを作成して、同時または非同期コントローラへの同時リクエストを50回発生させます。私は非同期コントローラがより多くの同時リクエストを完了することを期待しましたが、正反対のものが真であることがわかりました。同期コントローラは、約50分の50を正常に完了しました。非同期コントローラは50のうち約10だけを正常に完了しました。

これはなぜですか?非同期コードの目的は、より多くの同時リクエストを処理できることだと思いました。

私は困惑。

+0

この制限は、同時に複数の要求を処理するのに問題がある「サーバー」上にある可能性があります。 – JanR

+5

ここにコードの関連部分を掲載してください。あなたのコードを検索するように人々に依頼するのは公正ではありません。問題を特定の領域に絞り込み、ここに貼り付けます。 – CodingYoshi

+0

私は混乱しています。あなたのスピードについて話している質問のタイトルでは、あなたは成功/失敗の違いについて話しています。いくつかのコメントと結果でコードの関連部分を貼り付けることができますか? – agfc

答えて

1

私はこの問題を解決しました。この問題は、私がVisual Studioからコードを実行していたことが判明しました。私はそれを "リリース"モードで実行していたにもかかわらず、動作を変更したことがありました(私にはわかりません)。私はコードを「公開」し、それをVisual Studioの外で実行しましたが、それは予想通りに実行されました。すべての助けと提案をありがとう!

+0

うれしい、うれしかった:)それは新しい変更でgithubリポジトリを更新するのにも良いアイデアです –

+0

私に思い出させるためのおかげで。私はちょうど変更をプッシュした。私もそれについてのブログ記事を作った。 http://jeremykruer.com/why-my-synchronous-api-scaled-better-than-my-asynchronous-api/ – jkruer01

+0

nice !!!ありがとうございました:)また、私はそれがうまく働いてうれしく思います。これをテストする別の方法は、https://github.com/dotnet/BenchmarkDotNetを使用することです。 –

3

問題は、デフォルトで使用すると、2回の同時通話の制限があり、http要求であり、それは長く取っている理由です、次のドキュメントを参照してください。

http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx https://msdn.microsoft.com/en-us/library/system.net.servicepoint.aspx

そしてまた、この:Trying to run multiple HTTP requests in parallel, but being limited by Windows (registry)

この値を変更してみてください:)

+0

私はそれを試して、私が見つけたものをあなたに知らせるでしょう。ありがとう! – jkruer01

+0

スタートアップクラスにこの行を追加しましたが、それでも問題は解決しませんでした。 System.Net.ServicePointManager.DefaultConnectionLimit = 1000; – jkruer01

+0

同期コードをより速く実行させ、より多くの要求を許可しましたが、非同期コードは依然としてより少ない要求を正常に完了しています。 – jkruer01