Joe*_* Gö 8 c# delegates exception-handling exception
我遇到了一个常见的问题.当我有一个可能由几个不同的类订阅的事件时,这些类之一抛出的异常将终止回调链; 因为我不知道回调执行顺序的先验,这可能导致某些类的不可预测的状态更改而不是其他类.
在圣经中(CLR通过C#,我使用的是C#2.0)有一个关于使用MulticastDelegate.GetInvocationList来解决这个问题的简短段落,但仅此而已.所以我的问题是:处理这个问题的最佳方法是什么?我MulticastDelegate.GetInvocationList每次举办活动都必须使用吗?或者我是否需要在某种回滚机制中包含可能作为委托链的一部分调用的所有方法?与简单的事件/委托模型相比,为什么所有这些选项都如此复杂?在C#中如此易于使用?我怎样才能使用简单的方法而不会以损坏的状态结束?
谢谢!
Mar*_*ell 12
如果只是调用委托,它将按顺序调用所有目标方法.GetInvocationList如果要单独执行它们,则需要使用- 例如:
Cancel每次之后检查至于使用它的最佳方式:你希望它如何表现?我不清楚......例如,这可能非常适合扩展方法:
static void InvokeIgnoreErrors(this EventHandler handler,
object sender) {
if(handler != null) {
foreach(EventHandler subHandler in handler.GetInvocationList()) {
subHandler(sender, EventArgs.Empty);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以打电话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;
}
Run Code Online (Sandbox Code Playgroud)
在第一个事件请求取消后停止.