thisソースからの非同期Web開発の概念を研究して、概念を証明するためのサンプルアプリケーションを作成しました。ASP.NET C#5 Async&Awaitを使用した非同期Webアプリケーション
このソリューションは、2つのASP.NET Web APIアプリケーションで構成されています。最初のものはシミュレートされた遅いエンドポイントです。それは、リストの学生と呼ばれるカスタムクラスを返す前に1000msのを待ち:ここ
public IEnumerable<Student> Get()
{
Thread.Sleep(1000);
return new List<Student> { new Student { Name = @"Paul" }, new Student { Name = @"Steve" }, new Student { Name = @"Dave" }, new Student { Name = @"Sue" } };
}
はStudentクラスです:
public class Student
{
public string Name { get; set; }
}
このエンドポイントは、ローカルホスト上のIIS 7でホストされている:4002。
第二のアプリケーションコンタクト第2のエンドポイント、1つの同期、他の非同期使用:
public IEnumerable<Student> Get() {
var proxy = WebRequest.Create(@"http://localhost:4002/api/values");
var response = proxy.GetResponse();
var reader = new StreamReader(response.GetResponseStream());
return JsonConvert.DeserializeObject<IEnumerable<Student>>(reader.ReadToEnd());
}
public async Task<IEnumerable<Student>> Get(int id) {
var proxy = new HttpClient();
var getStudents = proxy.GetStreamAsync(@"http://localhost:4002/api/values");
var stream = await getStudents;
var reader = new StreamReader(stream);
return JsonConvert.DeserializeObject<IEnumerable<Student>>(reader.ReadToEnd());
}
これは、ローカルホスト上のIIS 7でホストされている:4001。
両方のエンドポイントが正常に動作し、 1秒。上記の13:25のリンクの動画に基づいて、非同期メソッドはスレッドを解放して競合を最小限に抑える必要があります。
Apache Benchを使用してアプリケーションのパフォーマンステストを実行しています。ここでは、同期メソッドの応答時間は、10回の同時要求である:
これは私が期待通りくらいです。より多くの同時接続は競合を増やし、応答時間を延長します。しかし、ここでは非同期の応答時間は以下のとおりです。
あなたが見ることができるように、まだいくつかの競合があるようです。私は、平均応答時間がより均衡すると予想していました。両方のエンドポイントで同時リクエスト数50回のテストを実行しても、同様の結果が得られます。
これに基づいて、非同期メソッドのオーバーヘッドを考慮せずに、非同期メソッドと同期メソッドの速度が多少なりとも同じであるように見えますが、非同期メソッドはスレッドをThreadPoolに戻してください。私はコメントや説明を歓迎する、ありがとう。
最も大きな変化は、メソッドがデータベースなどの外部ソースに依存している場合です。 – JustAnotherUserYouMayKnow
ありがとうございます、これは私がシミュレートしたものですが、長時間実行されているリクエストの場合に当てはまると思います。非同期フレームワークがCPUバインディングとは対照的にIOベースのリクエストに最適化されていることをお勧めしますか?コードを変更してデータベースリクエストを追加します。 –
async-frameworkのポイントは、レスポンスを待たなければならないときにスレッドを解放することです。その間、他の作業も処理できます。これは、大部分のIOベースの要求の場合です。データベースから大量のデータを要求すると、その間にスレッドは何をすべきですか?データが戻ってくるまで待ってください...一方、スレッドプールに戻り、データが戻ってくるまで他の作業をしますか? – JustAnotherUserYouMayKnow