WebAPI 2支持异步过滤方法。 我没有看到这种异步过滤方法的意义,或者我想念它们? 由于过滤器需要在控制器方法之前执行,因此它必须同步运行!?为什么异步过滤器会带来优势呢?它与webapi中的线程处理有关吗? 我的问题清楚了吗? 提前谢谢你的回答! 最好 月桂精
答案 0 :(得分:18)
异步和并行是两回事。您无法并行运行操作方法和操作筛选器,因为您需要首先执行筛选器(OnActionExecuting
)。但是,OnActionExecuting
是异步的,只是意味着它是非阻塞的。
假设您必须进行长时间运行的网络呼叫,可能是在您的过滤器代码中运行10秒的HTTP请求。在同步(或阻塞)过滤器代码的情况下,运行过滤器代码的线程将被阻塞10秒,直到HTTP调用返回。在这10秒钟内,线程被简单地阻止,并没有做任何有用的事情。
如果是异步过滤器,则不会阻止运行过滤器的线程。相反,它将返回到池中,并且在10秒长的HTTP调用正在进行时,它将准备好为其他一些请求提供服务。线程返回池时,Web API管道执行暂停。一旦HTTP调用完成并且结果可用,过滤器代码将在同一个线程或其他某个线程中恢复执行,并且Web API管道从其暂停的位置开始运行。
因此,仅仅因为过滤器代码是异步的,并不意味着当过滤器触发的HTTP调用正在进行时,管道执行将继续进行。只是运行管道的线程没有被阻塞并被释放到池中。
说,你正在读一本书而且你遇到了一些你不太清楚的事情,并问你的朋友谁是这方面的专家。你的朋友花了几分钟回答你。在此期间,您无需继续盯着这本书。同时,说你不能继续阅读。因此,您只需放置书签并快速执行某些操作,例如检查手机中的网站或其他内容。现在,朋友回答,你得到你想要的东西,然后继续阅读。