【问题标题】:A Single .NET Event Subscriber Associated with Multiple Event Publishers & Multithreading与多个事件发布者和多线程关联的单个 .NET 事件订阅者
【发布时间】:2010-08-20 13:21:55
【问题描述】:

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

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

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

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

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

我意识到这有点拗口,我很乐意提供更多信息。

【问题讨论】:

    标签: c# multithreading events concurrency delegates


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      听起来你是响应式框架的完美人选。 (接收)

      http://codebetter.com/blogs/matthew.podwysocki/archive/2009/10/14/introducing-the-reactive-framework-part-i.aspx

      我仍在努力解决这个问题,但这种情况正好适合这项新技术。

      【讨论】:

      • +1 Rx 美味。项目主页here。一些样品here。你会对 ObserveOn(..context..) 方法感兴趣。
      【解决方案3】:

      感谢两位的回复。

      @Grzenio:如果线程不能覆盖方法参数,这是否意味着方法本身不需要锁语句,即该方法实际上是线程安全的:

      private void DoSomething(object someObject, object someOtherObject) {
         lock(someVariable) {
      
         // Does this code need to be locked, or is the method thread-safe?
         // Surely 2 threads accessing this method could result in a race condition?
      
         }
      }
      

      @Tim:谢谢,我会调查一下。

      【讨论】:

      • 如果您可以继续将此更新复制到您的原始问题中,然后删除此答案。那是stackoverflow上的标准协议。它使我们更容易关注更新:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2020-10-31
      相关资源
      最近更新 更多