2015-09-03 4 views
0

Вот несколько вопросов в связи с обработкой событий:EventHandler Продолжительность и асинхронное выполнение

Вопрос 1

В принципе, может обработчик события (UI или нет) методы выполняются в течение относительно длительного времени ?

Вопрос 2

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

Вопрос 3

Во всяком случае, когда метод обработчика событий асинхронно вызывается с помощью BeginInvoke классом публикации этого события, это нужно обязательно вызвать соответствующий EndInvoke, и даже принимать в расчет возможность исключения? Или, может быть, лучше, чтобы класс поднял событие, чтобы игнорировать их?

ответ

0

Ответ на вопрос 1

См jgauffin. В основном обработчики событий должны выполнять за относительно короткий промежуток времени, чтобы не блокировать выполнение остальных зарегистрированных обработчиков или обработку следующих событий. Излишне говорить, что это требование приобретает решающее значение при работе с событиями, обработка которых не позволяет пользовательскому интерфейсу!

Ответа на вопрос 2

Предполагая, что класс публикации события не знаком со всеми возможными обработчиками событий (особенно рассматривать событие, опубликованное некоторый DLL экспортируемого класса), класс должен назвать все зарегистрированных обработчиков асинхронно. Но это имеет свои затраты (переключение потоков, кеширование, параллелизм, синхронизация, & c: см., Например, Brannon, Manoj Sharma или даже this wiki), которые не должны оплачиваться, если это не должно быть. Поэтому лучшим вариантом является предоставление каждому зарегистрированному обработчику, который, конечно же, знает, сколько времени занимает его собственная работа, решите, должен ли он выполнять свою собственную работу синхронно или асинхронно. И вот хорошая идея: событие может использовать свою структуру event-arguments для публикации времени, выделенного для каждого обработчика (это время в основном рассчитывается путем деления общего времени обработки событий, разрешенного количеством зарегистрированных в данный момент слушателей), позволяя каждому обработчику использовать эту информацию, чтобы решить, выполнять ли ее собственную работу синхронно или асинхронно.

Ответ на вопрос 3

См MSDN (примечание "Важно!"), Hans Passant (видную мирового класса.NET), Bruno Brant, и в конечном итоге STW, который также поставляет демонстрационный код; все они, похоже, сильно выступают за вызов EndInvoke и устранение возможных исключений. (Действительно, некоторые программисты склонны избегать использования исключений, но исключения присущи методам C++, Java и .NET и, тем более, с функциями Python. Если большие данные s/w, такие как Hadoop и приложения выше, интенсивно используют исключения , то любой может.)

Postscript

в конце концов, после того, как понял, что никто не собирается отвечать на мой вопрос, я обратился к социальному MSDN Microsoft, где я сразу же получил ответ от Магнуса (также видный эксперт мирового класса .NET), который в основном согласился с вышеприведенными аргументами; смотреть наш соответствует here.