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

时间:2017-04-07 18:48:50

标签: asp.net entity-framework async-await

在.NET 4.5中,使用async / await模式,可以通过在异步控制器方法中包含> ring.middleware.anti-forgery/*anti-forgery-token* => #object[clojure.lang.Var$Unbound 0x1eae055 "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"] 来轻松取消Web请求。这当然可以传递给任何异步实体框架方法,整个事情可以很好地取消。

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

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

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

1 个答案:

答案 0 :(得分:6)

  

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

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

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

最后请注意,请告知EF团队您的绩效问题。