在异步/等待之前的过去,WebAPI请求是如何被取消的?

BCA*_*BCA 2 asp.net entity-framework async-await

在.NET 4.5中,使用async/await模式,可以通过CancellationToken在异步控制器方法中包含一个Web请求来轻松取消.这当然可以传递给任何异步实体框架方法,整个事情可以很好地取消.

但回到6年前,在异步之前,WebAPI或MVC控制器方法是如何取消的?它甚至可能吗?如果是这样,是否有可能在取消的请求中取消长时间运行的实体框架查询?

我的询问动机是我已经进行了一些实验,发现在几乎所有情况下,我的同步版本的大型EF查询都比它们的异步对应项更快.异步版本的长度在10%到50%之间.此外,我的应用程序是供内部使用的,并且实际上只能为最多3个并发用户提供服务,因此可伸缩性不是问题.

简而言之,我想要老式的,同步的Entity Framework方法(因此,同步控制器方法)的速度,但具有可取消性.

Ste*_*ary 6

但回到6年前,在异步之前,WebAPI或MVC控制器方法是如何取消的?它甚至可能吗?如果是这样,是否有可能在取消的请求中取消长时间运行的实体框架查询?

旧版ASP.NET用于Thread.Abort取消同步请求.这当然最终导致应用程序不稳定,因此ASP.NET将定期回收您的应用程序域(和服务进程).

我不确定遗留的ASP.NET是否Thread.Abort用于取消异步请求(当他们运行代码时,我的意思是).我会这么认为,但我不确定.

最后,请告知EF团队您的性能问题.