Monitor.TryEnter(object) 和 Monitor.TryEnter(object, ref bool) 之间存在什么重要区别?

2024-05-25

这些代码片段的行为似乎应该相同:

1:Monitor.TryEnter(对象)

if (Monitor.TryEnter(lockObject))
{
    try
    {
        DoSomething();
    }
    finally
    {
        Monitor.Exit(lockObject);
    }
}

2:Monitor.TryEnter(object, ref bool) - .NET 4.0 中引入

bool lockAcquired;
try
{
    Monitor.TryEnter(lockObject, ref lockAcquired);
    if (lockAcquired)
    {
        DoSomething();
    }
}
finally
{
    if (lockAcquired)
    {
        Monitor.Exit(lockObject);
    }
}

我从MSDN文档中看到过载采取ref bool范围 http://msdn.microsoft.com/en-us/library/dd289679.aspx:

如果由于以下原因未获取锁 抛出异常,变量 指定为已锁定范围 是false该方法结束后。这 允许程序确定,在 所有情况,是否有必要 释放锁。

但文档also指出过载仅需要object参数不会抛出任何异常,除了ArgumentNullException。所以看起来好像代码片段中抛出了异常1以上,只能是因为lockObject is null,在这种情况下没有锁定(并且TryEnter会回来的false)无论如何,所以Monitor.Exit不需要打电话。

显然,他们不会无缘无故地引入这种过载。那么是什么场景Monitor.TryEnter(object, ref bool)方法旨在解决?


  1. Monitor.TryEnter 可能会成功,然后触发异步异常,例如 ThreadAbortException 或 OutOfMemoryException(可能在没有可见分配的情况下发生)。然后锁将被占用但永远不会被释放。

See: 锁和异常不能混用 http://blogs.msdn.com/b/ericlippert/archive/2009/03/06/locks-and-exceptions-do-not-mix.aspx

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

Monitor.TryEnter(object) 和 Monitor.TryEnter(object, ref bool) 之间存在什么重要区别? 的相关文章

随机推荐

  • 如何在winform应用程序中生成产品收据?

    我第一次开发 winform 应用程序 我有一个 gridview 其中包含用户已购买的产品列表 我点击了一个 打印 按钮 允许用户生成如下收据 所以在这里我很困惑是否应该使用 winform默认RDLC或Crystal Report 或者
  • 在 Perl 中,“$a”和“$b”在 sort() 函数之外还有什么特殊用途吗?

    我问了一个关于 Perl 中 a 和 b 使用的问题sort 前几天的功能 Perl 的 sort 函数中的 a 和 b 到底是什么 https stackoverflow com questions 26127617 what exact
  • IIS - 打开基本身份验证会导致登录重定向循环

    在 IIS 站点上启用基本身份验证后 我尝试访问该站点 它不显示登录表单 而是将我重定向到其他地方 其中包含一个我无法弄清楚的长链接 http 我的域名 Login Login Login ReturnUrl 2FLogin 2FLogin
  • 在 MongoDB 中删除时自动删除引用对象

    假设我有一个这样的架构 var Person new Schema name String var Assignment new Schema name String person ObjectID 如果我删除一个人 仍然可能会留下引用不存
  • 了解自加入

    我正在练习自加入这是我在编写查询时不明白的事情 我有一张桌子 employee 员工表包含三个记录 id employee manager id 1 Ola NULL 2 Ahmed 1 3 Tove 1 最后一列 manager id 引
  • Heroku 启动超时(错误 R10)

    每次我启动应用程序时 如果没有以下内容 它就无法超过 60 秒点 2012 05 06T22 41 11 00 00 heroku web 1 Stopping process with SIGKILL 2012 05 06T22 41 1
  • FAT32 格式存储上的文件系统链接

    我知道FAT32 还有FAT16 12都不支持符号链接 nor 硬链接 然而我想到了这个想法 FAT 规范描述了每个文件都与一个目录项相关联 根据我的理解 可以说目录中的文件条目以某种方式或其他方式points文件的内容 那么 如何定义两个
  • IntelliJ IDEA 13 + Tomcat 7 部署

    我尝试在 Tomcat7 上的 IDEA 中部署空的 Web 应用程序 Tomcat 停止在线工作 INFO Deploying web application directory C devel Servers apache tomcat
  • 解码 JavaScript Web 令牌 (JWT) 的到期日期?

    我无法理解应用程序中嵌入的 JWT 的到期日期格式 例如 1473912000 这翻译成什么 1473912000 毫秒 某个 x 日期 任何帮助将不胜感激 正如詹姆斯所指出的 该数字是自 1970 年 1 月 1 日以来的秒数 这被转换成
  • 想要并行运行非线程安全库 - 可以使用多个类加载器来完成吗?

    我从事的一个项目中 我们使用的库不能保证线程安全 实际上也不是 并且在 Java 8 流场景中是单线程的 它按预期工作 我们希望使用并行流来获得容易实现的可扩展性成果 不幸的是 这会导致库失败 很可能是因为一个实例干扰与另一实例共享的变量
  • 使用 VBA 将数据从 Excel 导出到现有 PowerPoint 幻灯片

    我正在编写一个小型 excel 插件来进行一些简单的数据分析 但不幸的是我不是 VBA 程序员 到目前为止我已经做了什么 从巨大的 Excel 工作簿中获取数据并执行计算 将结果写入预先格式化的 Excel 骨架 文件 我接下来想要做什么
  • 即使不改变对象和数组,也无法更改减速器中的嵌套对象

    我正在尝试更新减速器内的状态 我知道我不应该改变对象或嵌套对象 所以我使用map用于数组或对象的对象扩展 但似乎我无法真正更改深层嵌套的值 除了我无法更改状态这一事实之外 我真的不喜欢代码的外观 尤其是仅更改一个属性所需执行的循环数量 我觉
  • 如何在winform的中心设置控件?

    您好 我正在尝试在表单中心设置控件 即标签或文本框 当我最大化该形式时我需要这个 我可以静态或动态设置它吗 大家有什么想法请尽快告诉我 将控件放在中心并设置Anchor财产给None
  • 单元测试魔术方法

    当涉及到 PHP 中魔术方法的单元测试实现时 调用这些方法的推荐方法是什么 我看到三个可用选项 显式 直接调用它们 object gt get someValue 间接调用它们 使用任何旨在触发它们的操作 object gt someVal
  • 命令行字符串的最大长度

    在Windows中 命令行字符串的最大长度是多少 意思是如果我指定一个在命令行上接受参数的程序 例如abc exe name abc 我编写的一个简单的控制台应用程序通过命令行获取参数 我想知道最大允许数量是多少 来自微软文档 命令提示符
  • 能够在 WPF 网络浏览器中支持 Html5

    我的WPF浏览器不支持网页上的html5元素 我不知道如何实现对它的支持 我确实安装了 IE9 并且可以看到使用 IE 浏览的 html5 元素 非常感谢任何关于如何添加对 html5 支持的帮助 我实际上自己找到了解决方案 一切都在这个页
  • Web 应用程序架构 - 需要作业/任务队列吗?

    我目前正在设计一个 Web 应用程序 该应用程序将允许用户安排将针对 HTTP API 代表他们 执行的任务 这些任务可以重复出现 并且可用于调度的最小时间分辨率为一分钟 由于任务的性质 我认为异步执行它们是有意义的 但是 这部分的架构应该
  • 如何将一个div的内容克隆到另一个div

    我想使用jquery克隆将选定div的内容复制到另一个div 但我不想将它附加到任何地方 我的意思是 当我们用 jquery 克隆一个 div 时 如果我错了 请纠正我 我们必须设置它的位置 它将动态创建一个显示的新分区 但我想获取所选di
  • 在 powershell 3 中美化 json

    给定一个标准 json 字符串值 jsonString baz quuz cow moo cud foo bar 我怎样才能让这一切都漂亮的换行符 最好没有强力正则表达式 到目前为止我发现的最简单的方法是 jsonString Conver
  • Monitor.TryEnter(object) 和 Monitor.TryEnter(object, ref bool) 之间存在什么重要区别?

    这些代码片段的行为似乎应该相同 1 Monitor TryEnter 对象 if Monitor TryEnter lockObject try DoSomething finally Monitor Exit lockObject 2 M