ASP.NET WebAPI 2异步过滤器

3

WebAPI 2 支持异步过滤器方法。 我不明白这些异步过滤器方法的意义,或者我误解了它们? 由于过滤器需要在控制器方法之前执行,因此它必须同步运行!那么为什么异步过滤器会带来优势呢?它与 WebAPI 的线程处理有关吗? 我的问题清楚吗? 谢谢您提前的答复! 最好的祝福, laurin

1个回答

20

异步和并行是两个不同的概念。你不能同时运行一个操作方法和一个动作过滤器,因为你希望过滤器 (OnActionExecuting) 先执行。然而,OnActionExecuting 是异步的只意味着它是非阻塞的。

假设你需要在过滤器代码中进行长时间的网络调用,可能是一个持续 10 秒钟的 HTTP 请求。在同步 (或阻塞) 过滤器代码的情况下,运行过滤器代码的线程将被简单地阻塞 10 秒钟,直到 HTTP 调用返回。在这 10 秒钟内,线程仅被阻塞,没有做任何有用的事情。

在异步过滤器的情况下,运行过滤器的线程将不会被阻塞。相反,它将返回到池中,并准备好在进行 10 秒钟的 HTTP 调用时服务一些其他请求。当线程返回到池中时,Web API 管道执行将暂停。一旦该 HTTP 调用完成并且结果可用,过滤器代码将在同一线程或其他线程中恢复执行,并且 Web API 管道将从暂停的点开始运行。

因此,仅仅因为过滤器代码是异步的,不意味着当过滤器发起的 HTTP 调用正在进行时管道执行会继续前进。只有运行管道的线程未被阻塞并释放到池中。

比方说,你在读一本书,遇到了一个你不太清楚的问题,然后向你的专家朋友请教。你的朋友需要几分钟时间来回答你。在这段时间内,你不需要继续盯着那本书。同时,假设你不能继续阅读。所以,你只需将书签放置在那里,并做一些非常快速的事情,如在手机上查看网站。现在,朋友回答了你的问题,你得到了你想要的,然后继续阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接