事件模式如何在 .NET 中工作?

事件是一种使用委托的简化模式。在 C# 中,所有委托都具有多播功能,即委托的实例不仅可以表示单个方法,还可以表示方法列表。例如 -

例子

delegate int Transformer(int x);
static void Main(){
   Transformer perform = x =>{
      int result = x * x;
      Console.WriteLine(result);
      return result;
   };
   perform += x =>{
      int result = x * x * x;
      Console.WriteLine(result);
      return result;
   };
   perform(2); // 打印 4 和 8
}

调用会Perform()调用添加到委托中的两个方法。这些方法按照它们被添加的顺序被调用。

这允许您实现发布-订阅,也称为事件模式。发布者包含一个委托字段。它通过调用委托来决定何时发布。订阅者将自己的方法添加到发布者的委托中,因此只要发布者决定通过调用委托进行发布,他们就会收到通知。订阅者不知道或干扰其他订阅者。

C# 事件是一种语言功能,它以类型安全的方式形式化上述模式,以防止委托出现常见错误。事件公开了实现事件模式所需的委托功能的子集。以下示例说明了这一点。

首先,定义要在事件发生时发送的数据的结构。

public class ThresholdReachedEventArgs : EventArgs{
   public int Threshold { get; set; }
   public DateTime TimeReached { get; set; }
}

然后,定义发布者,即想要引发事件的类。

public class Counter{
   // 1.定义一个事件
   public event EventHandler<ThresholdReachedEventArgs> ThresholdReached;
   // 2.做一些引发事件的事情,并传递EventArgs自定义数据
   public void DoSomething(){
      ThresholdReachedEventArgs e = new ThresholdReachedEventArgs{
         Threshold = 10,
         TimeReached = DateTime.Now
      };
      // 3.提高实际事件
      ThresholdReached?.Invoke(this, e);
   }
}

最后,创建一个或多个订阅者。想要侦听发布者引发的事件的类。

class Program{
   static void Main(string[] args){
      // 1.创建一个发布者的实例,你想听
      Counter counter = new Counter();
      // 2. 在发布者上附加一个事件处理程序
     counter.ThresholdReached+= OnThresholdReached;
      //3. 做一些会引发事件的事情。现在您已准备好收听事件。
      counter.DoSomething();
   }
   // 4. 处理发布者引发的事件
   static void OnThresholdReached(object sender, ThresholdReachedEventArgs e){
      Console.WriteLine($"Reached Threshold {e.Threshold} at {e.TimeReached.ToString()}");
   }
}

示例

using System;
class Program{
   static void Main(string[] args){
      // 1.创建一个发布者的实例,你想听
      Counter counter = new Counter();

      // 2. 在发布者上附加一个事件处理程序
     counter.ThresholdReached+= OnThresholdReached;

      //3. 做一些会引发事件的事情。现在您已准备好收听事件。
      counter.DoSomething();
   }

   // 4. 处理发布者引发的事件
   static void OnThresholdReached(object sender, ThresholdReachedEventArgs e){
      Console.WriteLine($"Reached Threshold {e.Threshold} at {e.TimeReached.ToString()}");
   }
}
public class ThresholdReachedEventArgs : EventArgs{
   public int Threshold { get; set; }
   public DateTime TimeReached { get; set; }
}
public class Counter{
   // 1.定义一个事件
   public event EventHandler<ThresholdReachedEventArgs> ThresholdReached;
   // 2.做一些引发事件的事情,并传递EventArgs自定义数据
   public void DoSomething(){
      ThresholdReachedEventArgs e = new ThresholdReachedEventArgs{
         Threshold = 10,
         TimeReached = DateTime.Now
      };
      // 3.提高实际事件
      ThresholdReached?.Invoke(this, e);
   }
}
输出结果
Reached Threshold 10 at 5/15/2021 12:49:10 PM