我有一个可以引发可取消事件的扩展方法,如果它们被取消则返回一个bool:
public static bool RaiseCancel<T>(this EventHandler<T> ev, object sender, T e) where T : CancelEventArgs
{
if (ev == null)
{
return false;
}
foreach (Delegate del in ev.GetInvocationList())
{
try
{
ISynchronizeInvoke invoke = del.Target as ISynchronizeInvoke;
if (invoke != null && invoke.InvokeRequired)
{
invoke.Invoke(del, new[] { sender, e });
}
else
{
del.DynamicInvoke(sender, e);
}
}
catch (TargetInvocationException ex)
{
throw ex.InnerException;
}
// if (e.Cancel) return true;
}
return e.Cancel;
}
然而,我不禁想到它应该在处理程序为了提高效率而取消它时立即返回,而不是继续调用剩余的处理程序。据我所知,除了将Cancel
属性设置为true之外,任何可取消事件的处理程序都不应采取任何操作。既然如此,那么要求更多处理者做出已经做出的决定是什么意思呢?另一方面,如果一个对象正在侦听事件,那么当它发生时调用事件处理程序似乎是错误的。
我是否应该取消注释if语句(并将方法末尾的返回值替换为return false;
)?
编辑:我想如果你要继续调用处理程序,我是否应该允许处理程序自己做出决定(即,如果他们想要,他们可以在处理程序的开头有if (e.Cancel) return;
)? / p>
答案 0 :(得分:3)
注意:我在这里描述的仅仅是我认为有意义的。它可能无法在.NET框架中以这种方式实现(请参阅下面的JoãoAngelo的评论)
举一个例子:FormClosing
事件。如果处理程序取消此事件,则表单不会被关闭,因此通知其他处理程序表单正在关闭是没有意义的。
在更一般的情况下,如果在 e.Cancel 设置为true后调用其他处理程序,则表示您正在通知他们不再发生的事情......
所以在我看来,只要e.Cancel
设置为true,就应该停止调用处理程序。