如果第一个处理程序取消了它,应该将可取消的事件参数传递给所有处理程序

本文关键字:程序 处理 事件 可取消 参数传递 取消 第一个 如果 | 更新日期: 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 o Angelo的注释)

FormClosing事件为例。如果处理程序取消此事件,窗体将不会被关闭,因此通知其他处理程序窗体正在关闭是没有意义的。

在更一般的情况下,如果在之后调用其他处理程序。Cancel被设置为true,你在通知他们一些不再发生的事情…

所以在我看来,你应该停止调用处理程序,只要e.Cancel设置为true。