Если вы просто вызовете делегата, он будет вызывать все целевые методы по порядку. Вам нужно использовать GetInvocationList
, если вы хотите выполнить их индивидуально - например:
- проверять
Cancel
после каждого
- для захвата возвращаемого значения каждого
- для продолжения после отказа отдельной цели
Что касается лучшего способа его использования: как вы хотите, чтобы он вел себя? Мне не понятно ... например, это может вполне подойти для метода расширения:
static void InvokeIgnoreErrors(this EventHandler handler,
object sender) {
if(handler != null) {
foreach(EventHandler subHandler in handler.GetInvocationList()) {
subHandler(sender, EventArgs.Empty);
}
}
}
Тогда вы можете просто позвонить myHandler.InvokeIgnoreErrors(this);
(например).
Другим примером может быть:
static bool InvokeCheckCancel(this CancelEventHandler handler,
object sender) {
if(handler != null) {
CancelEventArgs args = new CancelEventArgs(false);
foreach(CancelEventHandler subHandler in handler.GetInvocationList()) {
subHandler(sender, args);
if(args.Cancel) return true;
}
}
return false;
}
, который останавливается после запроса отмены первого события.