Рассмотрим код, используя GetInvocationList
:
foreach (var handler in theEvent.GetInvocationList().Cast<TheEventHandler>()) {
// handler is then of the TheEventHandler type
try {
handler(sender, ...);
} catch (Exception ex) {
// uck
}
}
Это мой старый подход, более новый подход, который я предпочитаю выше, потому что он упрощает вызов, включая использование параметров out / ref (если желательно).
foreach (var singleDelegate in theEvent.GetInvocationList()) {
try {
singleDelgate.DynamicInvoke(new object[] { sender, eventArg });
} catch (Exception ex) {
// uck
}
}
, который по отдельности вызывает каждого делегата, который был бы вызван с
theEvent.Invoke(sender, eventArg)
Удачного кодирования.
Не забудьте выполнить стандартную проверку на отсутствие защиты (и, возможно, блокировку) при работе с событиями.