如果第一个处理程序取消它,是否可以将可取消的事件args传递给所有处理程序?

时间:2011-04-07 09:37:25

标签: c# event-handling

我有一个可以引发可取消事件的扩展方法,如果它们被取消则返回一个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>

1 个答案:

答案 0 :(得分:3)

注意:我在这里描述的仅仅是我认为有意义的。它可能无法在.NET框架中以这种方式实现(请参阅下面的JoãoAngelo的评论)

举一个例子:FormClosing事件。如果处理程序取消此事件,则表单不会被关闭,因此通知其他处理程序表单正在关闭是没有意义的。

在更一般的情况下,如果在 e.Cancel 设置为true后调用其他处理程序,则表示您正在通知他们不再发生的事情......

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