【问题标题】:Handlers overwriting Cancel property on CancelEventArgs处理程序覆盖 CancelEventArgs 上的 Cancel 属性
【发布时间】:2009-03-02 20:02:59
【问题描述】:
CancelEventArgs 提供了一个名为 Cancel 的属性,不同的事件处理程序可以设置它来告诉调用事件的对象是否应该继续执行取消操作。
似乎由于事件是多播委托,因此事件的简单引发可能会调用两个委托。第一个将 Cancel 属性设置为 true,第二个将 Cancel 属性设置为 false。组件/框架的“可取消”事件是否支持这些场景并逐个调用每个委托,在每一步检查取消标志?提出此类事件的最佳做法是什么?是否只有一个 CancelEventArgs 实例传递给每个委托?是否使用了单独的实例?
【问题讨论】:
标签:
c#
events
event-handling
【解决方案1】:
一个小实验很快表明他们使用了 1 个 Cancel 实例(可能是 EventArgs 对象)。
这有点像一场赌博,结果取决于附加事件处理程序的顺序。
在 CancelEventArgs 的特殊情况下,我认为正确的模式是将 Cancel 设置为 true 或不理会它,因此顺序无关紧要。
【解决方案2】:
测试:
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;
附加事件处理程序的顺序很重要。
一般来说,具有不可变事件参数的事件和多播委托不应一起使用,但 .NET 框架非常广泛地使用此类事件。