如果第一个处理程序取消了它,应该将可取消的事件参数传递给所有处理程序
本文关键字:程序 处理 事件 可取消 参数传递 取消 第一个 如果 | 更新日期: 2023-09-27 17:48:58
我有一个扩展方法,引发可取消的事件,如果它们被取消,返回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;
),如果他们想?
注意:我在这里描述的只是我认为有意义的。它可能不会在。net框架中以这种方式实现(参见下面jo
以FormClosing
事件为例。如果处理程序取消此事件,窗体将不会被关闭,因此通知其他处理程序窗体正在关闭是没有意义的。
在更一般的情况下,如果在之后调用其他处理程序。Cancel被设置为true,你在通知他们一些不再发生的事情…
所以在我看来,你应该停止调用处理程序,只要e.Cancel
设置为true。