アプリケーションが外部サービスに依存している場合に非同期プログラミングを使用することが重要である理由の 1 つは、ASP.NET が IO 完了ポートを使用できるようにすることです。これにより、外部サービスの応答を待っているスレッドをブロックするのではなく、ASP.NET外部サービスが応答するたびに、IO 完了ポートで実行を保留し、別の要求に対応するためにスレッドを使用できます。その後、ASP.NET はその実行を再度取得して再開します。このように、どのスレッドもブロックされません。
非同期メソッドの例は次のとおりです。
[HttpPost]
public async Task<ActionResult> Open(String key)
{
Foo foo= await _externalService.GetFoo(key);
return View(foo);
}
しかし、外部サービスへの複数のリクエストを使用するとどうなるでしょうか? ASP.NET はそれをどのように処理しますか?
[HttpPost]
public async Task<ActionResult> Open()
{
List<Task<Foo>> tasks = new List<Task<Foo>>();
foreach (var key in this.Request.Form.AllKeys)
tasks.Add(_externalService.GetFoo(key));
var foos = await Task.WhenAll(tasks);
Foo foo = null;
foreach (var f in foos)
{
if (foo == null && f != null)
foo = f;
else
foo.Merge(f);
}
return View(foo);
}
まだ IO 完了ポートを使用していますか? またはTask.WhenAll
、スレッドがブロックされているためですか?