【问题标题】:What is the Asynchronous Benefit of ReadAsMultipartAsync?ReadAsMultipartAsync 的异步优势是什么?
【发布时间】:2012-09-22 04:49:40
【问题描述】:

一位同事向我展示了一些他们在 ASP.NET Web Api 中处理上传文件的代码。是这样的:

    Task<IEnumerable<HttpContent>> task = Request.Content.ReadAsMultipartAsync(provider);

    return task.ContinueWith<HttpResponseMessage>(contents =>
    {
        //Do stuff...
    }

异步读取文件有什么好处?

【问题讨论】:

    标签: c# asp.net-mvc asynchronous asp.net-web-api


    【解决方案1】:

    从网络套接字读取文件是一个 I/O 绑定操作。异步执行此操作可确保您在读取期间不会危及服务器上的工作线程,但您正在利用 I/O 完成端口。

    【讨论】:

      【解决方案2】:

      这完全是关于使用异步释放处理请求的线程。一旦你这样做了,线程将能够处理另一个请求。

      也最好不要使用ContinueWith,我在解释why

      【讨论】:

      • 嘿,我看到您在 .net 社区中非常活跃 - 非常感谢。但是,据我了解,读取文件受 CPU 限制。如果是这样,异步读取它的意义何在?
      • @scoarescoare,读取文件几乎可以肯定是io绑定,不是 CPU绑定
      • @scoarescoare 它是 IO 绑定的。从网络读取、访问文件系统、读取数据库、从流(redis、...)读取都是 IO 绑定的。 计算是 CPU 密集型的。
      • @spender 感谢您的澄清。请在下面查看我的评论。
      • @Aliostad 是的,你是对的。就术语而言,我的错误。我假设从网络套接字读取上传的文件是由 .NET 资源 处理的,因此会浪费上下文切换。我知道操作系统使用 I/O 完成端口从网络套接字读取文件。这有意义吗/你明白我为什么感到困惑了吗?
      【解决方案3】:

      同步 IO 需要时间并挂起您的代码,即使它不在磁盘上(与网络相反)。切换到异步 IO 通过让框架处理您的 IO 请求而不阻塞您的客户端代码来缓解这种情况。

      【讨论】:

      • 您还记得,问题不在于异步如何工作或异步编程的好处。我很好奇为什么异步读取上传的文件在 ASP.NET Web API 中有很多好处。在这种情况下,仍然需要资源来处理文件。
      • 是的,处理文件需要资源,但您的问题是关于从网络套接字读取文件 -Request.Content.ReadAsMultipartAsync。它是异步的,以便在此读取期间释放所有线程并从 I/O 完成端口中受益。如果您同步读取它,那么您将浪费服务器上的资源,不仅用于处理文件,还用于读取它。
      • 您还记得,您的实际问题结束于“异步读取文件有什么好处?”我哪一点做错了?
      • @DarinDimitrov 这正是我想要的。感谢您向我介绍 I/O 完成端口 - 这让事情变得更清楚了。将此作为答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 2018-06-09
      • 2014-08-03
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多