我对 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/