c# - 与多个事件发布者和多线程关联的单个 .NET 事件订阅者

标签 c# multithreading events concurrency delegates

假设我有一个类,包含一个简单的方法。假设有一个委托(delegate)与此方法具有相同的签名。

我想运行多个长时间运行的进程,每个进程都从此类启动。每个进程包含一个事件,它由与上述委托(delegate)相同类型的多播委托(delegate)组成。一旦实例化了每个“ worker ”类,上面提到的“控制”类就会使用上述相同的简单方法订阅 worker 的事件。一旦每个 worker 的工作完成,它的事件就会被调用。

在单线程环境中,这种架构相当简单。但是,我计划在单独的线程上运行每个工作进程。因此,多个 worker 将(几乎)同时调用它们的事件,每个事件都由控制类的简单方法订阅。

如果委托(delegate)是不可变的,是否可以保证每个线程都可以独占访问简单方法?我不关心将代码锁定在简单方法中,我担心线程 #1 将使用一组参数调用该方法,而线程 #2 几乎同时调用相同的方法。

在Thread#1进入lock语句之前,Thread#2(几乎与Thread#2同时进入方法)是否可以覆盖Thread#1指定的参数,导致Thread#2的参数被有效处理两次?

我知道这有点啰嗦,我很乐意提供更多信息。

最佳答案

线程不能覆盖方法的参数 - 这些参数存储在堆栈中并且始终是线程安全的。在您的情况下,唯一可能不是线程安全的是您类(class)的状态。

关于c# - 与多个事件发布者和多线程关联的单个 .NET 事件订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3531181/

相关文章:

c# - 具有 "implements"限制的更高级接口(interface)

c# - 二元运算符 Add 没有为类型 'System.Byte' 和 'System.Byte' 定义

c++ - 如何加快 OpenCV 代码的实现速度

javascript - 当鼠标从一个 div 移动到另一个 div 并按住按钮时,jQuery 单击事件不起作用

c# - 为什么无参数结构构造函数必须在 C# 6 中公开?

c# - 使用 protobuf 为 c# 反序列化 "long"字符串对我来说不能正常工作

java - Java内存模型中线程发散 Action 和外部 Action 的例子

Python 线程模块 - GUI 仍然卡住

c# - 取消订阅匿名委托(delegate)事件

.net - 寻找仅在用户选中 CheckBox 时触发的事件