【发布时间】:2014-02-20 00:23:51
【问题描述】:
当我们的应用程序依赖外部服务时使用异步编程很重要的原因之一是允许 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 阻塞了一个线程?
【问题讨论】:
标签: asp.net multithreading task-parallel-library async-await io-completion-ports