c# - ASP.NET MVC 输出缓存 "thread safe"

标签 c# asp.net asp.net-mvc multithreading asp.net-mvc-4

我正在使用属性 [OutputCache(Duration=XXX)](以及 donut 变体 [DonutOutputCache(Duration=XXX)])。

但是我注意到(由 ASP.NET (MVC) Outputcache and concurrent requests 确认)这不是线程安全的:当重新生成缓存时,如果 Controller 方法足够慢(通常情况如此,这就是缓存它的原因 ^^) ,多个“相同”请求可以进入操作并执行操作,而不是只处理 1 个请求,阻止其他请求并从缓存中为它们提供服务。

有什么方法可以轻松制作阻塞/线程安全的 OutputCache 属性? DonutOutputCache 有同样的问题吗?像 [BlockingOutputCache(SameParameters)][BlockingDonutOutputCache(SameParameters)]

注意:缓存的 Action 是常规 Action ,返回View(model),在 Action 和 View 中完成了繁重的工作( View 可以做一些非常简单的事情,比如@Model.GetPrice()这意味着后端的繁重工作)。

谢谢!

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

最佳答案

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

关于c# - ASP.NET MVC 输出缓存 "thread safe",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19284750/

相关文章:

c# - 当一种类型需要额外的属性时尝试实现多态性

c# - asp.net c#DetailView如何设置列宽

c# - 从 ASP.NET MVC 中的 View 中的 HTML 字符串下载 PDF

c# - Response.StatusCode 在 nunit 测试中为 null

c# - 当数据异步更改时迭代类中数据的正确方法

c# - 使用 Html agility pack 从 html 页面中提取 id 样式

c# - 在 Windows 窗体应用程序中托管 ASP.NET Core API

c# - 使用 SendMessage 通过电子邮件发送文件附件而不保存文件

c# - 仅限时间的编辑器模板和验证

c# 扩展一个表达式