许多不同的类对象侦听单个事件 c#



我有一个相机处理程序类,每次它收到帧数据时,它都会调用一个事件,如下所示:

public delegate void FrameAcquiredCallback(byte[] frameData);
public void OnFrameArrived(MediaFrameReader sender, MediaFrameArrivedEventArgs args) {
FrameAcquired.Invoke(buffer); // buffer is a byte[] that I set up previously.
}

一旦一个类对象想要访问该byte[] frameData,它所要做的就是订阅事件,如下所示:

public class Start1
{
public CameraHandler camera;
public void Start()
{
camera = new CameraHandler();
camera.FrameAcquired += eventTest1;
}
public static void eventTest1(byte[] frameData)
{
Console.WriteLine("Received1");
}
}

现在我想做的不仅仅是一个类,而是多个不同的类对象,以便能够订阅同一事件并访问byte[] frameData

当我创建一个新类并以类似的方式订阅时,我现在有两个 CameraHandler 实例化,这将不起作用。

实现此功能的最干净和"规范"的方式是什么?

您可以通过自定义事件访问器挂接任意数量的侦听器。

public class Start1
{
public EventHandler FrameAcquired
{
add 
{
this.camera.FrameAcquired += value;
}
remove
{
this.camera.FrameAcquired -= value;
}
}

你做的完全没问题。如果只访问一个相机,则只需要一个 CameraHandler 对象来创建多个事件处理程序。

但是,如果您可以同时访问多个摄像机,则需要一个摄像机处理程序列表,例如List<CameraHandler> cameras以便您可以从特定相机获取所需的数据。不过,如果您正在使用 IMU 信息,则应注意同步。

您还可以查看事件聚合器模式。 https://prismlibrary.github.io/docs/event-aggregator.html https://www.codeproject.com/Articles/866547/Publisher-Subscriber-pattern-with-Event-Delegate-a

最新更新