5

当我们的应用程序依赖于外部服务时,使用异步编程很重要的原因之一是允许 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阻塞了一个线程?

4

1 回答 1

7

它仍然使用 I/O 完成端口。WhenAll是异步的,不会阻塞线程。

于 2014-01-28T15:59:04.057 回答