【发布时间】:2014-02-02 13:30:30
【问题描述】:
WebAPI 2 支持异步过滤方法。 我看不到这种异步过滤器方法的意义,或者我可能误解了它们? 由于过滤器需要在控制器方法之前执行,它必须同步运行!?那为什么异步过滤器要带来优势呢?它与来自 webapi 的线程处理有关吗? 我的问题清楚吗? 预先感谢您的回答! 最好的 月桂酸
【问题讨论】:
标签: c# asp.net asynchronous asp.net-web-api
WebAPI 2 支持异步过滤方法。 我看不到这种异步过滤器方法的意义,或者我可能误解了它们? 由于过滤器需要在控制器方法之前执行,它必须同步运行!?那为什么异步过滤器要带来优势呢?它与来自 webapi 的线程处理有关吗? 我的问题清楚吗? 预先感谢您的回答! 最好的 月桂酸
【问题讨论】:
标签: c# asp.net asynchronous asp.net-web-api
异步和并行是两个不同的东西。您不能并行运行操作方法和操作过滤器,因为您需要先执行过滤器 (OnActionExecuting)。但是,OnActionExecuting 是异步的只是意味着它是非阻塞的。
假设您必须进行一个长时间运行的网络调用,可能是在您的过滤器代码中运行 10 秒的 HTTP 请求。在同步(或阻塞)过滤器代码的情况下,运行过滤器代码的线程将被阻塞 10 秒,直到 HTTP 调用返回。在这 10 秒内,线程只是被阻塞,没有做任何有用的事情。
在异步过滤器的情况下,运行过滤器的线程不会被阻塞。相反,它将返回到池中,并准备好在 10 秒长的 HTTP 调用正在进行时为其他请求提供服务。当线程返回到池中时,Web API 管道执行暂停。一旦 HTTP 调用完成并且结果可用,过滤器代码将在同一线程或其他线程中恢复执行,并且 Web API 管道从暂停点开始运行。
因此,仅仅因为过滤器代码是异步的,并不意味着当过滤器触发的 HTTP 调用正在进行时,管道执行将继续进行。只是运行管道的线程没有被阻塞并被释放到池中。
假设您正在阅读一本书,并且遇到了一些您不太清楚的内容,请询问您的朋友谁是该主题的专家。您的朋友需要几分钟来回答您。在那段时间里,你不需要继续盯着书看。同时,说你不能继续阅读。因此,您只需放置一个书签并快速执行一些操作,例如在手机中查看网站或其他内容。现在,朋友回答,你得到你想要的,然后继续阅读。
【讨论】: