C# 为所有对象订阅相同的事件处理程序是线程安全的吗

2024-05-29

我的项目中有一种情况,我连接到多个服务器并监听事件。每当从服务器接收到事件时,Handler 就应该将该事件添加到公共队列中进行处理。所有连接都应将接收到的事件添加到队列中。

foreach(var item in collection)
{
        Connection c = new connection(item);

         c.start();
         c.EventReceived+=new EventHandler(myHandler);
         list.add(c);
}

protected void  myHandler(eventArgs)
{
     //add it to the concurrent queue
}

在这里我怀疑它是否能够在没有任何线程问题的情况下处理这些事件。如果您有任何模式或内置 API 可以安全地处理此问题,请告诉我。


线程安全总是需要一个上下文 - a从何而来.

如果你的意思是+=

For the +=,这取决于事件的实现方式。如果它被实现为类似字段的事件,即

public event SomeEventType EventReceived;

那么是的:它是线程安全的。该规范要求类似字段事件的访问器是线程安全的,尽管实现可能有所不同(例如,MS 编译器过去使用lock(this) or lock(typeof(DeclaringType)),但是它现在使用Interlocked反而)。

如果该事件是手动实现的,即

public event SomeEventType EventReceived {
    add { ... }
    remove { ... }
}

那么线程安全性完全由add/remove实施。

如果你的意思是调用

那么这是线程安全的,因为委托是不可变的,但请注意,这一切都发生在调用该线程的单个线程上。然而,一个常见的错误是在null test:

if(EventReceived != null) EventReceived(this, someArgs);

以上是not线程安全,因为从技术上讲,EventReceived测试后可以改变。为了确保这不会出错,应该是:

var handler = EventReceived;
if(handler != null) handler(this, someArgs);

如果你指的是处理程序

然后线程安全性完全由各个处理程序定义。例如,在 UI 应用程序中,处理程序必须检查并切换到 UI 线程。

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

C# 为所有对象订阅相同的事件处理程序是线程安全的吗 的相关文章

  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 读写器的信号量解决方案:更新读取器计数和等待或发出读/写二进制信号量信号之间的顺序?

    从操作系统概念来看 在解决第一个读者 作者问题时 读者 进程共享以下数据结构 semaphore rw mutex 1 semaphore mutex 1 int read count 0 do wait rw mutex writing
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • PyCharm - 如何挂起所有线程

    我们使用 PyCharm 5 0 1 进行多线程调试 当它在断点处停止时 只有特定线程停止 而所有其他线程继续 这使得 冻结时刻 和检查参数值以及其他线程的当前状态变得困难 当其中一个线程在断点处停止时 是否可以挂起所有线程 这在最新的 P
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi

随机推荐

  • 使用 useState 更新状态时功能组件不更新 DOM

    EDIT 代码笔在这里https codepen io mark kelly the looper pen abGBwzv https codepen io mark kelly the looper pen abGBwzv 我有一个显示
  • Git 与人工制品

    刚刚完成 NPM 和 Bower 的 Artifactory 设置 它非常容易使用 您只需更改存储库 URL 一切就正常了 查看有关如何让 Artifactory 与 github vcs 一起使用的文档 它看起来过于复杂 我想知道是否有人
  • Oauth 2:access_token 是用户的唯一密钥吗?

    一个用户之后与 Facebook 连接 https developers facebook com docs authentication Facebook 回应access token 我可以假设这个吗access token将始终保持不
  • 使用 ui-router 的 angular.js,如何仅重新加载一个视图?

    我有一个相当简单的待办事项应用程序 使用 angular js 我正在使用 ui router 库 我查看了 github 上的 ui router 示例 https github com angular ui ui router tree
  • 如何从嵌套字典中获取键?

    我在字典中的字典中有一个列表 FirmA ProductA Color1 Color2 Color3 我想构建第一公司字典级别的键列表 然后 我需要根据公司密钥访问第二级产品字典 最后 我需要根据字典级别 2 产品 中的产品密钥访问颜色列表
  • 如何查找所有mysql表之间的所有关系?

    如何找到MySQL所有表之间的所有关系 例如 如果我想知道大约有 100 个表的数据库中表的关系 有什么办法知道这个吗 从编程角度来说 更好的方法是从以下位置收集数据 INFORMATION SCHEMA KEY COLUMN USAGE表
  • 我应该将哪个 STL 容器用于 FIFO?

    哪种 STL 容器最适合我的需求 我基本上有一个 10 个元素宽的容器 我在其中不断地push back新元素的同时pop front计算最旧的元素 大约一百万次 我目前正在使用std deque对于这项任务 但想知道是否std list会
  • Node WebKit 和 YouTube:chrome 未定义

    我正在开发一个应用程序Android iOS Mac OS and Windows using PhoneGap and Node WebKit 该应用程序已嵌入youtube videos These youtube视频在我的中运行良好M
  • 使用 flex 将项目与底部对齐

    我正在尝试使用 flex 将父级内部的项目与父级底部对齐 但由于某种原因它不起作用 我究竟做错了什么 login border 1px solid red height 50px display flex login border radi
  • 使用公钥时出现 InvalidKeySpecException

    我正在拼命尝试在 Android 上使用非对称公钥 私钥加密技术来加密消息 我在 Windows 上 使用 puttygen 生成了公钥和私钥 我不确定它有什么区别 但我选择了 SSH 2 RSA 这是公钥 AAAAB3NzaC1yc2EA
  • 如何将多个 parquet 文件附加到 Pandas 中的一个数据帧

    我正在使用 Spark 和 Pandas 解压缩 snappy parquet 文件 我有 180 个文件 我的 Jupyter 笔记本中有 7GB 数据 根据我的理解 我需要创建一个循环来获取所有文件 用 Spark 解压缩它们并附加到
  • “pylint”不被识别为内部或外部命令、可操作程序或批处理文件

    我使用的是 Windows 10 我使用命令安装了 pylint 包pip install pylint user并且安装成功 但是当我尝试在命令提示符中运行命令时 我得到了 pylint is not recognized as an i
  • 谷歌数据工作室计算字段的条件语句

    我正在使用谷歌数据工作室 我正在尝试使用创建一个计算字段case声明 但它不起作用 衡量标准是销售额 以下是示例行 CASE WHEN SUM sales gt 350000 THEN 1 ELSE 0 END 上面的公式给了我一个错误 如
  • 如何从 Xcode 4.5 卸载 iOS 5.0 模拟器

    我已经安装了 Xcode 4 5 由于我编写应用程序是为了好玩 我不打算支持旧版 iOS 版本 并且为了节省 500 GB iMac 上的空间 是否有办法删除它 尝试从 Xcode 包中支持的平台中删除 iPhone iPhoneSimul
  • Python 3.7 RPM 创建

    我正在尝试通过以下方式为 Python 3 7 3 创建 RPM 文件Python RPM https docs python org 3 distutils builtdist html但收到 文件未找到 错误 请按照以下链接查看日志 L
  • Azure git 部署 - 第二个程序集中缺少引用

    我正在尝试将 Bitbucket 部署设置到 Azure 网站 我成功链接了 Bitbucket 和 Azure 但是当我推送到 Bitbucket 时 我在 Azure 站点上收到以下错误 如果我单击 查看日志 它会显示以下编译错误 D
  • 我无法在本地主机上播放 .mp3 文件

    我正在使用 HTML jQuery 和 XML 制作音乐播放器 XML 文件包含所有歌曲的名称及其路径 我无法在本地访问 XML 文件 因为 Chrome 不允许这样做 所以我尝试在本地主机上运行它 但本地主机不允许我播放 mp3 我在本地
  • openSSL:PEM_write_RSAPublicKey 和 PEM_write_RSA_PUBKEY 之间的区别

    在 openssl 库中 我可以看到两种将公钥写入文件的方法 int PEM write RSAPublicKey FILE fp RSA x int PEM write RSA PUBKEY FILE fp RSA x 在文档中我可以看到
  • 为 python 的 csv 阅读器中的特定行添加下标?

    我希望能够通过 csv 阅读器访问 csv 文件的特定行 例如第四行 有没有办法用 python 的 csv reader 模块来做到这一点 您只需解析所有 CSV 文件 然后使用正常的排序索引即可 否则 你可以做这样的事情 def my
  • C# 为所有对象订阅相同的事件处理程序是线程安全的吗

    我的项目中有一种情况 我连接到多个服务器并监听事件 每当从服务器接收到事件时 Handler 就应该将该事件添加到公共队列中进行处理 所有连接都应将接收到的事件添加到队列中 foreach var item in collection Co