处理程序覆盖CancelEventArgs上的Cancel属性

时间:2009-03-02 20:03:00

标签: c# events event-handling

CancelEventArgs提供了一个名为Cancel的属性,不同的事件处理程序可以设置告诉调用该事件的对象是否应该继续执行取消该操作。

似乎因为事件是多播委托,所以简单地引发事件可能会调用两个委托。第一个将Cancel属性设置为true,第二个将Cancel属性设置为false。组件/框架'可取消'事件是否支持这些场景并逐个调用每个委托,在每一步检查取消标记?提出这类活动的最佳做法是什么?是否只有一个CancelEventArgs实例传递给每个委托?是否使用了单独的实例?

2 个答案:

答案 0 :(得分:2)

一个小实验很快就会显示他们使用了一个取消实例(可能是EventArgs对象)。

这使得它有点赌博,结果取决于Eventhandler附加的顺序。

在CancelEventArgs的特定情况下,我认为正确的模式是将Cancel设置为true或不管它,所以顺序无关紧要。

答案 1 :(得分:1)

测试:

public static void Main() {
    Event += (sender, e) => e.Cancel = true;
    Event += (sender, e) => e.Cancel = false;
    Event += (sender, e) => e.Cancel = true;

    var args = new CancelEventArgs();
    Event(null, args);

    WL(args.Cancel);
}

static event EventHandler<CancelEventArgs> Event;

附加事件处理程序的顺序很重要。

一般来说,具有非不可变事件args和多播委托的事件不应该一起使用,但.NET框架会非常广泛地使用这些事件。