C# ASP.NET MVC Outputcache“;线程安全“;

C# ASP.NET MVC Outputcache“;线程安全“;,c#,asp.net,asp.net-mvc,multithreading,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Multithreading,Asp.net Mvc 4,我使用的是属性[OutputCache(Duration=XXX)](还有甜甜圈变量[donutputcache(Duration=XXX)]) 但是,我注意到(由确认)这不是线程安全的:当重新生成缓存时,如果控制器方法足够慢(通常情况下,这就是为什么要缓存它^^^),多个“相同”的请求可以进入操作并执行操作,而不是只处理一个请求,阻止其他请求并从缓存中为其提供服务 有什么方法可以轻松地使阻塞/线程安全OutputCache属性?对于DonutOutputCache,同样的问题?类似于[Bloc

我使用的是属性
[OutputCache(Duration=XXX)]
(还有甜甜圈变量
[donutputcache(Duration=XXX)]

但是,我注意到(由确认)这不是线程安全的:当重新生成缓存时,如果控制器方法足够慢(通常情况下,这就是为什么要缓存它^^^),多个“相同”的请求可以进入操作并执行操作,而不是只处理一个请求,阻止其他请求并从缓存中为其提供服务

有什么方法可以轻松地使阻塞/线程安全
OutputCache
属性?对于
DonutOutputCache
,同样的问题?类似于
[BlockingOutputCache(SameParameters)]
[BlockingDonutOutputCache(SameParameters)]

注意:缓存的操作是常规操作,返回
视图(模型)
,在操作和视图中完成繁重的工作(视图可以做一些非常简单的事情,比如@model.GetPrice(),在后端转换为繁重的工作)

谢谢


编辑:另一种方法是创建一个
[BlockingAction(BlockingParameters)]
属性,当不从缓存提供服务时,该属性将阻止对该操作的后续请求。

您可以使用VaryByCustom。在Global.asax中,重写GetVaryByCustomString方法。然后创建唯一的缓存密钥,并在缓存存储上使用双重检查锁定。这是同步方式。我可能猜,当您开始缓存解析,然后结束缓存解析时,存在异步方式。

您已经发布的链接解决了您的问题。这实际上非常聪明,不需要太多更改!我会尝试找出细节(我可能会创建一个特殊属性,我现在还不知道我要做什么),并让这个问题保持最新。谢谢你的回答!我同意,但这太笼统了,不能成为“被接受”的答案,对不起。