与多个事件发布者关联的单个.NET事件订阅者&多线程

时间:2010-08-20 13:21:56

标签: c# multithreading events concurrency delegates

假设我有一个类,包含一个简单的方法。假设有一个代表与此方法具有相同的签名。

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

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

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

在线程#1进入lock语句之前,线程#2(与线程#2几乎同时进入该方法)会覆盖线程#1指定的参数,从而导致线程#2的参数被有效地处理两次?

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

听起来你是Reactive Framework的完美候选人。 (RX)

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

我仍然试图绕过它,但这种情况恰好在这个新技术的甜点上。

答案 2 :(得分:0)

感谢您的回复。

@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:谢谢,我会调查一下。

相关问题