Много различных объектов класса, слушающих одно событие c # - PullRequest
0 голосов
/ 25 октября 2018

У меня есть класс обработчика камеры, который при каждом получении данных кадра вызывает событие, как показано ниже:

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.

Когда я создаю новый класс и подписываюсь аналогично, у меня теперь есть два экземпляра CameraHandlers, которые не будут работать.

Каков наиболее чистый и «нормальный» способ реализации этой функциональности?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

То, что вы сделали, прекрасно.Если вы обращаетесь только к одной камере, вам просто нужен один объект CameraHandler для создания нескольких обработчиков событий.

Однако, если у вас есть доступ к нескольким камерам одновременно, тогда вам потребуется список cameraHandlers, например List<CameraHandler> cameras, чтобы вы могли получать нужные данные с определенной камеры.Однако следует помнить о синхронизации, если вы работаете с информацией IMU.

0 голосов
/ 25 октября 2018

Вы также можете посмотреть на шаблон агрегатора событий.https://prismlibrary.github.io/docs/event-aggregator.html https://www.codeproject.com/Articles/866547/Publisher-Subscriber-pattern-with-Event-Delegate-a

0 голосов
/ 25 октября 2018

Вы можете подключить столько слушателей, сколько захотите, с помощью пользовательских средств доступа к событиям .

public class Start1
{
  public EventHandler FrameAcquired
  {
    add 
    {
      this.camera.FrameAcquired += value;
    }
    remove
    {
      this.camera.FrameAcquired -= value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...