锁定一个物体

2024-04-18

我经常看到这样的代码此处显示 http://msdn.microsoft.com/en-us/library/ak9w5846.aspx,即分配一个对象,然后将其用作“锁定对象”。

在我看来,您可以使用任何对象来实现此目的,包括事件本身作为锁定对象。为什么要分配一个不执行任何操作的新对象?我的理解是,在对象上调用 lock() 实际上并不会改变对象本身,也不会实际锁定它以使其不被使用,它只是用作多个锁定语句锚定的占位符。

public class Shape : IDrawingObject, IShape
{
    // Create an event for each interface event
    event EventHandler PreDrawEvent;
    event EventHandler PostDrawEvent;

    object objectLock = new Object();

    // Explicit interface implementation required.
    // Associate IDrawingObject's event with
    // PreDrawEvent
    event EventHandler IDrawingObject.OnDraw
    {
        add
        {
            lock (objectLock)
            {
                PreDrawEvent += value;
            }
        }
        remove
        {
            lock (objectLock)
            {
                PreDrawEvent -= value;
            }
        }
    }
}

所以我的问题是,这真的是一件好事吗?


包括事件本身

不,你不能那样做。 “事件”实际上只是一些访问器方法。假设您指的是支持委托,那将非常糟糕 - 委托是不可变的:每次添加/删除订阅者时,您都会得到一个不同的代表。

实际上,4.0 编译器现在使用无锁代码来完成此操作Interlocked- 可能值得采用这种方法。

在你的例子中,objectLock确保所有调用者(该实例)都锁定same对象,这很重要 - 但没有锁定的丑陋this(这就是 C# 编译器的方式used上班)。

--

更新:您的示例显示了 C# 4.0 之前必需的代码,访问类似字段的事件inside类型直接与字段对话:不遵守正常的类字段事件锁定。这在 C# 4.0 中发生了变化;你现在可以(在 C# 4.0 中)safely将其重写为:

public class Shape : IDrawingObject, IShape
{
    // Create an event for each interface event
    event EventHandler PreDrawEvent;
    event EventHandler PostDrawEvent;

    event EventHandler IDrawingObject.OnDraw
    {
        add { PreDrawEvent += value; }
        remove { PreDrawEvent -= value; }
    }
}

然后遵循所有正确的行为。

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

锁定一个物体 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • Visual Studio 默认自动完成使用系统类型名称

    奇怪的问题 但我的老板有点老派 坚持在我们的编码标准中我们不使用 C 简写系统类型 他喜欢我们使用完整的系统名称 他喜欢事情变得冗长 我很乐意遵守这个标准 然而 几个月后开始让我恼火的是 Visual Studio 在完成代码时不喜欢遵守标
  • Android 如何从相机捕获两个连续的帧

    我正在尝试在 Android 设备上对光流进行编程 我的问题是从相机获取两个连续的帧 这是获取一帧的代码 mCamera setPreviewCallback new PreviewCallback public void onPrevie
  • Java 装饰器模式:我可以装饰受保护的方法吗?

    我想要Decorate 装饰器设计模式 一个通用的基类 但是我需要的方法Decorate受到保护 参见示例 public class AbstractActor public void act Delegates its actions t
  • 强制隐式调用的依赖类型解析

    我有一个包装特征 trait Wrapper T type Own F lt OwnThing F def ask F implicit own Own F 还有不同的实现 这里是一个例子 class CombinedWrapper A B
  • 暗淡和公共有什么区别?

    今天提出了一个关于范围的问题 这引起了我的思考 我一直了解 VBScript 范围以及如何声明全局和本地 我突然想到我从来没有使用过Public变量但倾向于使用Dim相反 在全局声明时 据我了解Dim是相同的Public 但如果是这样的话
  • PHP 密码的正则表达式 [重复]

    这个问题在这里已经有答案了 我在网上找到了一个脚本 它有一个 JavaScript 中的密码正则表达式 我仍然想使用它 但为了更安全 我也想使用 PHP 来验证我的密码 但我对正则表达式毫无用处 要求 必须至少 8 个字符 必须包含至少 1
  • 使用 sass 3 自定义 Bootstrap 5 颜色时出现无效 CSS 值错误

    我想用 SASS 更改 bootstrap 默认主题颜色 问题是当我更改颜色并编译时 它会给我无效的 CSS 值错误 我已阅读文档并在 YouTube 上看到了一些教程 但我看不出问题出在哪里 我正在使用 bootstrap 5 1 0 s
  • 此应用程序是否使用广告标识符 (IDFA)? - AdMob 6.8.0

    我目前正在将我的应用程序上传到 App Store Apple 询问我此应用程序是否使用 IDFA 我正在使用最新的 Admob SDK 或 6 8 0 但我不知道它是否使用 IDFA 如果使用 我应该点击哪些复选框 Image http
  • 调用重写的虚函数而不是重载

    假设我有这部分代码 include
  • 从 python 3 脚本构建适用于 Windows 的 .exe

    我想为 python 3 脚本构建一个可执行文件 导入 pyqtgraph 使用 pyqt5 导入 theano 和 pymc3 还导入 numpy scipy sys os 打开一个用 qt 设计器制作并存储在 ui 文件中的简单 GUI
  • 使用 Kotlin 创建新目录,Mkdir() 不起作用

    var filename blesson txt var wallpaperDirectory File sdcard Wallpaper wallpaperDirectory mkdirs val outputFile File wall
  • 在 D3.js 中绘制多条线

    到目前为止 我一直在使用循环将线条元素添加到 D3 可视化中 但这似乎不符合 API 的精神 假设我有一些数据 var data time 1 value 2 value2 5 value3 3 value4 2 time 2 value
  • 如何从仅包含键和键值对列表的列表创建字典(Python)?

    这是这个问题的延伸 如何在 Python 中拆分列表中的字符串以创建键值对 https stackoverflow com questions 12739911 how to separate string and create a key
  • 如何在 ASP.NET MVC Web 应用程序中使用 Ninject?

    我创建了一个新的 MVC Web 应用程序 并且引用了 Ninject dll Ninject Web Common dll 和 Ninject Web MVC dll Global asax cs public class MvcAppl
  • Application.Ontime 取消无法调用对象“Application”的“ONTIME”方法

    I am 完全地失去了所以任何帮助将不胜感激 我试图取消打开工作簿时触发的 2 个计划事件 并使用 Application Ontime 方法重复 我知道要终止 OnTime 计划循环 您必须提供计划运行的确切时间 并且拥有多个 Appli
  • 在 doxygen 中使用 SVG

    我正在尝试将 SVG 添加到我的 doxygen 文档中 第一次尝试是使用 image blabla svg 这有点工作 但是 SVG 包含另一个 png 参考 并且 内部 png 未显示 这在 Chrome 上有效 但即使在 Firefo
  • .NET 通过 TLS 1.2 删除客户端证书

    您好 似乎这个问题的某种形式已经被问过一百万种不同的方式 但许多人没有答案 或者答案不适用于我 我们有一个微不足道的小型 NET 服务 可以调用目前仅支持 TLS 1 2 的第 3 方 API var requestHandler new
  • Spring错误 - springframework.web.client.HttpClientErrorException:404 Not Found

    我正在尝试使用将对象传递给另一个类Spring 我不确定我使用的术语是否正确 我对Spring 这边走 TestServicesUtils getTemplate postForLocation http serverConfig port
  • PHP语句同步或异步

    早上好 我想知道 PHP 准备语句是同步还是异步 例如 req1 UPDATE statement1 connection gt prepare req1 statement1 gt execute req2 SELECT statemen
  • 锁定一个物体

    我经常看到这样的代码此处显示 http msdn microsoft com en us library ak9w5846 aspx 即分配一个对象 然后将其用作 锁定对象 在我看来 您可以使用任何对象来实现此目的 包括事件本身作为锁定对象