加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 异步操作方法和IO完成端口

发布时间:2020-12-16 06:49:50 所属栏目:asp.Net 来源:网络整理
导读:当我们的应用程序依赖外部服务时,使用异步编程很重要的原因之一是允许ASP.NET使用IO完成端口,而不是阻止等待外部服务响应的线程,ASP.NET可以将执行停放在IO完成端口并使用该线程来访问另一个请求,只要外部服务响应,然后ASP.NET再次获取该执行并恢复它.这样,
当我们的应用程序依赖外部服务时,使用异步编程很重要的原因之一是允许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阻塞了一个线程?

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读