代码之家  ›  专栏  ›  技术社区  ›  Szymon Rozga

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

  •  3
  • Szymon Rozga  · 技术社区  · 16 年前

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

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   Henk Holterman    16 年前

    一个小实验很快表明,它们使用了Cancel的一个实例(可能是EventArgs对象的实例)。

    这让它有点像赌博,结果取决于事件处理程序的连接顺序。

    在CancelEventArgs的特定情况下,我认为正确的模式应该是将Cancel设置为true或不处理它,因此顺序应该无关紧要。

        2
  •  1
  •   Michael Damatov    16 年前

    测试:

    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 framework非常广泛地使用此类事件。