在.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方法的速度(因此,同步控制器方法),但具有可取消性。
答案 0 :(得分:6)
但回到6年前,在异步的日子之前,WebAPI或MVC控制器方法是如何取消的?它甚至可能吗?如果是这样,是否有可能在取消的请求中取消长期运行的实体框架查询?
旧版ASP.NET使用Thread.Abort
取消同步请求。这当然最终会导致应用程序不稳定,因此ASP.NET将定期回收您的应用程序域(和服务进程)。
我不确定遗留的ASP.NET是否使用Thread.Abort
来取消异步请求(当他们运行代码时,我的意思是)。我会这么认为,但我不确定。
最后请注意,请告知EF团队您的绩效问题。