如何锁定 ASP.NET MVC 操作?

2024-04-22

我已经编写了一个用作服务的控制器和操作。 这项服务的运行成本相当高。 如果当前已存在正在运行的操作,我想限制对此操作的访问。

有没有内置的方法来锁定 ASP.NET MVC 操作?

Thanks


您在寻找这样的东西吗?

public MyController : Controller
{
    private static object Lock = new object();

    public ActionResult MyAction()
    {
        lock (Lock)
        {
            // do your costly action here
        }    
    }
}

如果线程当前正在处理该操作中的代码,则上述内容将阻止任何其他线程执行该操作lock block.

更新:这是它的工作原理

方法代码始终由线程执行。在负载较重的服务器上,有可能有 2 个或更多不同的线程进入并开始并行执行一个方法。根据问题,这就是你想要防止的。

请注意如何private Lock对象是static。这意味着它在控制器的所有实例之间共享。因此,即使堆上构造了该控制器的 2 个实例,它们也共享同一个 Lock 对象。 (该对象甚至不必命名为 Lock,您可以将其命名为 Jerry 或 Samantha,它仍然具有相同的用途。)

这是发生的事情。您的处理器一次只能允许 1 个线程输入一段代码。正常情况下,线程A可以开始执行代码块,然后线程B可以开始执行它。因此理论上你可以让 2 个线程同时执行相同的方法(或任何代码块)。

The lock可以使用关键字来防止这种情况。当线程进入包裹在 a 中的代码块时lock部分,它“拾取”锁定对象(后面括号中的内容)lock关键字,又名Lock, Jerry, or Samantha,应将其标记为static场地)。在执行锁定部分的持续时间内,它“保留”锁定对象。当线程退出锁定部分时,它“放弃”锁定对象。从线程获取锁对象开始,直到它放弃锁对象,所有其他线程都被阻止进入代码的锁定部分。实际上,它们会“暂停”,直到当前正在执行的线程放弃锁对象。

因此线程 A 在 MyAction 方法的开头获取锁对象。在放弃锁对象之前,线程B也尝试执行该方法。但是,它无法获取锁对象,因为它已经被线程 A 持有。因此它等待线程 A 放弃锁对象。当它完成时,线程 B 就会获取锁对象并开始执行代码块。当线程 B 完成执行该块时,它会为下一个委托处理此方法的线程放弃锁对象。

...但我不确定这是否是您正在寻找的...

使用这种方法并不一定会使您的代码运行得更快。它只保证一段代码一次只能由1个线程执行。它通常用于并发原因,而不是性能原因。如果您可以在问题中提供有关您的具体问题的更多信息,可能会有比这个更好的答案。

请记住,我上面提供的代码将导致其他线程在执行该块之前等待。如果这不是您想要的,并且您希望“跳过”整个操作(如果它已经由另一个线程执行),那么请使用更像 Oshry 的答案。您可以将此信息存储在缓存、会话或任何其他数据存储机制中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何锁定 ASP.NET MVC 操作? 的相关文章

随机推荐

  • Javascript“this”被事件监听器覆盖[重复]

    这个问题在这里已经有答案了 我可能做错了什么 但在尝试将一些面向对象编程应用于 Javascript 时 我发现了一些有趣的行为 考虑以下 function Bug element this focusedCell null element
  • jquery导航

    我正在为网站登陆页面创建一个简单的导航 它将用户引导到客户业务的两侧之一 基本上包括当您滚动到一侧时屏幕被分成两半 另一侧淡出 My code HTML div a href retail html Retail a a href resi
  • 使用 C# 以 PDF 形式动态存储和发送 SSRS 报告

    我在 SSRS 中有一份报告 它以 a 作为参数SalesRepCode and Email生成 PDF 收据 如果我使用报告查看器 它就会正常工作 使用 C 我想为每个存在的销售代表自动生成 PDF 一旦呈现 PDF 我想将其存储在文件夹
  • 无法在 Simulator XCode 6.0 中运行应用程序

    从 XCode 5 0 迁移到 XCode 6 0 后 项目无法运行并出现以下错误 An error was encountered while running Domain FBSOpenApplicationErrorDomain Co
  • Firebase 数据库结构 - 需要建议

    我知道这个问题可能被视为基于意见的问题 但是我认为值得讨论正确构建数据库的方法 我在 Swift 中开发 iOS 应用程序 并决定使用 firebase 作为我的后端服务 让我们从应用程序描述开始 该应用程序旨在为图书阅读体验提供跟踪和社交
  • 断言失败时如何继续执行

    我正在使用 Selenium RC 使用 Java 和 eclipse 和 TestNG 框架 我有以下代码片段 assertTrue selenium isTextPresent Please enter Email ID assertT
  • Bootstrap 工具提示可以工作但由于 z 索引而隐藏?

    如果将鼠标悬停在第一支铅笔上 您可以看到工具提示出现 但它是隐藏的 我怎样才能让所有工具提示显示在其他所有内容之上 相关代码 nav text on click null function alert heyo nav text toolt
  • 从命令行(CLASSPATH)运行 Mahout

    在Windows下使用Maven成功编译了Mahout 我正在尝试从命令行运行示例之一 但我不明白我做错了什么 看起来像是 CLASSPATH 问题 假设我想运行 GroupLensRecommenderEvaluatorRunner 示例
  • 哪些数据会发送回 Paypal“返回”网址,以及如何将我自己的数据发送到此网址?

    实施标准 Paypal 立即购买 按钮 文档不清楚什么数据被传递到 返回 url 该文档也没有提及如何通过表单发送您自己的自定义数据 任何人都可以为此提供适当的文档吗 相关代码
  • C++ 中模板和 STL 的缺点 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 使用 STL 或模板有什么缺点吗 是否存在不适合的情况 首先 如果它们可以帮助您解决问题 您应该使用它们 模板是 C 非常重要的一部分 并且多年
  • 如何将 ISO7816 选择命令与 DESfire Ev1 卡一起使用?

    我有一张 DESfire Ev1 版本 1 3 卡 我正在尝试使用 ISO7816 apdu 样式选择一个文件 我有一份文件 需要帮助A0 A1 A2我可以使用本机或包装模式选择它 Native gt 5A A0 A1 A2 lt 00 W
  • CakePHP 2.0 中的错误处理。转义 viewVars [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 Cake 2 中遇到了一个奇怪
  • 如何在 Swift 中从备份中排除文件?

    我在 Swift 1 2 中工作得很好 因为我使用 filePath 作为字符串 现在 Swift 2 希望我们所有人都使用 URL 路径 尽管我正在阅读他们的文档 但我无法让它工作 I have var fileName myRespon
  • DEVISE 成功登录后,如何将用户重定向回之前需要登录的操作?

    我有一个 ajax 投票按钮 如果用户单击 竖起大拇指 图像 但尚未登录 那么他们应该看到一个对话框 要求他们先登录 为了实现这个对话框 我使用 jQuery 和 Facebox 绑定到 ajax failure 事件 如果用户未登录 De
  • 如何将 create-react-app 转换为 Preact?

    根据 Preact 文档 要将 React 应用程序转换为 Preact 您必须为 webpack 指定别名 resolve alias react preact compat react dom preact compat 你怎么能做到这
  • 我什么时候应该使用新的 ranged-for 以及我可以将它与新的 cbegin/cend 结合使用吗?

    The new 范围为当然 在 C 11 中会非常简洁和有用 据我了解它是如何工作的 它会查找 容器 begin and end通过尝试 Argument Depending Lookup ADT 但另一个补充是所有容器现在有cbegin
  • 使共享库可供多个应用程序使用的最佳方法是什么?

    与大多数商店一样 我们有一个团队负责各种项目 他们都需要访问与我们业务相关的相同核心信息和功能 通常使用 C 语言 目前 我们只是将公共类从一个项目复制到另一个项目 但每个人都开始有自己的风格 我们希望进行整合 我们使用 Tortoise
  • 如何在 f 字符串表达式中将数字格式化为两位小数?

    我正在尝试制作这个程序 询问用户他们的成绩并以两位小数显示他们的成绩 前任 如果他们的作业得分为 10 15 则会显示作业 1 66 66 在我的代码中 我似乎无法将计算出的数字转换为两位小数 print Please enter your
  • Django:使用 post_delete 信号时确定正在删除的用户

    我希望在删除某些对象时通知管理员 但我也想确定哪个用户正在执行删除 是否可以 这是代码 models py signal to notify admins when nodes are deleted from django db mode
  • 如何锁定 ASP.NET MVC 操作?

    我已经编写了一个用作服务的控制器和操作 这项服务的运行成本相当高 如果当前已存在正在运行的操作 我想限制对此操作的访问 有没有内置的方法来锁定 ASP NET MVC 操作 Thanks 您在寻找这样的东西吗 public MyContro