Я использую видеодекодер, который отправляет событие NewFrame
каждый раз, когда создается кадр.
Поскольку мне нужно выполнить некоторые задачи инициализации при первом запуске, мне нужно использовать перехват этогособытие кадра к функции playingStarted
, затем подключите его к другой функции, которая будет imageReceived
.
Итак, у меня есть это:
Action<byte[]> currentNewFrameDelegate;
MyClass() {
currentNewFrameDelegate = playingStarted;
decoder.NewFrame += currentNewFrameDelegate; // when a new frame is received
}
playingStarted(byte[] image) {
SomeInitializationTasks();
processImage(image); // Process that image anyway
currentNewFrameDelegate = imageReceived; // Switch to a normal image processing
}
imageReceived(byte[] image) {
processImage(image);
}
К сожалению, это не работаеттаким образом ... Функция playingStarted
по-прежнему выполняется каждый раз при получении NewFrame
.
Поскольку у меня есть несколько мест, где я хочу переключить этого делегата обратно на playingStarted
, я не хочуиспользуйте взлом - = then + =, чтобы предотвратить подписку на несколько событий, поскольку это делает код менее читабельным.
Как я могу переключить делегат события таким образом?
Редактировать:
Это может быть достигнуто следующим образом:
decoder.NewFrame += img => currentNewFrameDelegate?.Invoke(img);
Однако, он создает двойной вызов каждый раз, когда происходит событие ... Так что я, к сожалению, закончил тем, что написал это:
Action<byte[]> current;
void hookNewFrameEvent(Action<byte[]> x) {
decoder.NewFrame -= current;
decoder.NewFrame += x;
current = x;
}
Что остается наиболее эффективным решением в этомкритичный ко времени кусок кода.