当一个属性非常快地更改了几次时,发送了多少PropertyChanged事件

本文关键字:几次 事件 PropertyChanged 多少 一个 属性 非常 | 更新日期: 2023-09-27 18:10:57

我有一些实现PropertyChanged事件的代码(类似于下面的代码片段)。

private void SendPropertyChanged(string propertyName)
      {
         if(PropertyChanged != null)
         {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));  
         }
      }

我注意到我的事件处理程序只被调用一次,当相同的属性被非常快地改变几次时。我找不到任何提到这一点的文档。有人能确认这是否是PropertyChanged的预期行为吗?

当一个属性非常快地更改了几次时,发送了多少PropertyChanged事件

您所展示的代码将调用事件委托的次数与调用SendPropertyChanged的次数相同。这里没有魔法。然而,一种常见的方法(回到您没有显示的代码中的一个级别)是检查实际的更改,例如:

private int id;
public int Id {
    get { return id; }
    set {
        if(id != value) {
            id = value;
            SendPropertyChanged(); // let C# 5 compiler tricks supply the name
        }
    }
}
private void SendPropertyChanged([CallerMemberName]string propertyName = null)
{
    var handler = PropertyChanged;
    if(handler != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));  
    }
}
与测试:

    var obj = new Foo();
    int count = 0;
    obj.PropertyChanged += delegate { count++; };
    obj.Id = 1;
    obj.Id = 2;
    obj.Id = 3;
    Console.WriteLine(count); // outputs: 3
    count = 0;
    obj.Id = 1;
    obj.Id = 1;
    obj.Id = 1;
    Console.WriteLine(count); // outputs: 1

请记住,c#事件实际上只不过是一个函数调用。与常规函数调用有两个主要区别:-

  1. 对于事件,被调用方依赖于调用方,而不是依赖于调用方。

  2. 事件可以有一个调用列表,即单个调用者可以附加多个被调用者

事件引发机制中没有内置节流,所以您看到的效果一定有不同的解释。