c# - 如何让一个类的多个实例(在不同的线程中)监听同一个事件?

标签 c# multithreading events

我对 C# 中的事件处理和线程处理不熟悉,所以如果这个问题很基本,请原谅我:如何创建多个类在不同的线程上运行,所有类都监听同一事件?

例如,我经常收到一条新数据,但间隔是随机的。当这些数据到达时,我用新数据更新一个类,我们将其称为 MyDataClass,它会引发一个事件:MyDataClass.NewEvent

然后我有一个名为 NewEventHandler 的类。当事件触发时,此类使用新数据进行一些计算,然后将结果发送到另一个应用程序。

所以问题是这样的: 我需要大约 30 个 NewEventHandler 实例全部监听 MyDataClass.NewEvent (每个实例执行不同的计算并产生不同的结果)。重要的是,这些计算全部同时运行 - 一旦事件触发 NewEventHandler 的所有 30 个实例就开始计算。然而,它们是否一起完成并不重要(例如,这里不需要同步)。

如何实际创建 NewEventHandler 实例,以便它们在不同线程上运行,并让它们全部监听 MyDataClass.NewEvent 的单个实例?

最佳答案

在 C# 中,一般做法是在触发事件的同一线程上调用事件监听器的方法。从源类触发事件的标准模板是:

void FireNewEvent() 
{
     var tmp = NewEvent;
     if( tmp != null )
     { 
         tmp(this, YourEventArgsInstance);
     }
}

事件不多,只是一个小小的荣耀代表。因此,此调用类似于多播委托(delegate)调用 - 意味着将在运行 FireNewEvent 的同一线程上按顺序调用所有订阅者。我建议您不要改变这种行为。

如果您想同时运行事件订阅者,那么您可以在每个订阅者中启动一个新任务。

...
MyDataClass.NewEvent += OneOfSubscriberClassInstance.OnNewEvent;

...
public void OnNewEvent(object sender, YourEventArgs args)
{ 
   Task.Factory.StartNew( () => {

       // all your event handling code here 
   });
}

触发事件的代码将依次触发 30 个订阅者,但每个订阅者将在 TPL 调度的自己的线程中运行。因此,触发事件的委托(delegate)不必等待触发下一个订阅者的处理程序,直到当前调用的订阅者的处理程序完成对事件的处理。

关于c# - 如何让一个类的多个实例(在不同的线程中)监听同一个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16946864/

相关文章:

c# - 字符串文字和字 rune 字可以连接吗?

c# - 将调试启动外部程序选项设置为 Visual Studio 中类库的可执行文件

c# - 使用http创建WCF服务

c# - 如何从 Silverlight 以编程方式调用 Web 服务?

c# - 如何从另一个线程更新 GUI?

java - 在无限循环内调用 ExecutorService Submit()

events - AppleScript 可以监听事件吗?

java - 我应该在 Future<?> 上调用 cancel(true) 还是我自己的 FutureTask

c# - Xamarin.Forms 中的多个阶梯 slider

javascript - 如何在 Meteor 中触发的事件上插入元素?