Управляйте частотой срабатывания события, хотя присоединяясь к событию.Плохая практика? - PullRequest
4 голосов
/ 29 сентября 2011

Вчера я дал ответ на вопрос Как вы управляете запуском событий в C #? , который, короче говоря, задает следующее:

"Естьсобытие, которое срабатывает при получении нового кадра с камеры. Однако это происходит чаще, чем мне бы хотелось ... Как я могу контролировать, когда происходит событие? "

В своем ответе я предоставил код ниже, и этим утром я обнаружил, что у меня было 2 отрицательных отзыва без каких-либо комментариев.Меня беспокоит не потеря репутации, а логика, которую я использую в различных приложениях, и то, что отрицательные отзывы могут указывать на то, что мои реализации являются плохой практикой или ухудшают производительность.Таким образом, я прошу этот вопрос уточнить, если что-то не так с подключением / отключением контроллеров событий таким образом?

public MyObject()
{    
   MyTimer = new System.Timers.Timer(100); // 10 Hz
   MyTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
   MyTimer.Enabled = true;
}

private void ImageDataUpdated(object sender, EventArgs e) 
{
   // detach from the event to keep it from firing until the timer event has fired.
   MyImageObject.Update -= new UpdateEventHandler(ImageDataUpdated);

    // do stuff
}

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    // (re-)attach to the event handler.
   MyImageObject.Update += new UpdateEventHandler(ImageDataUpdated); 
}

Кроме того, я написал следующее, ссылаясь на то, что можно проверить, если выиметь каких-либо подписчиков до фактической подготовки данных для отправки подписчику.И в некоторых случаях это может привести к снижению загрузки процессора.Мне это кажется правильным (опять же, я делаю это сам), но что-то не так с этим утверждением?

Используя эту стратегию, есть большая вероятность, что вы мешаете базовому объекту изображения выполнять дополнительную работу, пока обработчик события отсоединен (конечно, это зависит от реализации объекта изображения).Скорее всего, вы сохраняете циклы процессора для собственной обработки изображений.

1 Ответ

2 голосов
/ 29 сентября 2011

Я полагаю, они чувствовали, что динамическое добавление и удаление событий на основе несвязанного таймера было плохой вещью. Хотя это хитрый трюк, который может пригодиться где-то , когда-нибудь , я склонен с ними согласиться. Внешнее управление обработчиками событий другого объекта не указывает на хорошую инкапсуляцию.

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

Затраты на сам фактический вызов события довольно малы, поэтому не беспокойтесь о нескольких вызовах на кадр, если «медленная часть» (т. Е. Бит, выполняющий реальную работу) не выполняется каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...