如何在 C# 中订阅一个事件,我们可以在 C# 中为一个事件设置多个订阅者吗?


事件使类或对象能够在发生某些感兴趣的事情时通知其他类或对象。

引发事件的类称为发布者,处理事件的类称为订阅者。

在事件中

一个事件可以有多个订阅者。一个订阅者可以处理来自多个发布者的多个事件。

没有订阅者的事件永远不会被触发。

发布者确定何时引发事件;订阅者确定对事件做出的响应操作。

示例

class Program {
   static void Main() {
      var video = new MP4() { Title = "Eminem" };
      var videoEncoder = new MP4EncoderNew();
      var mailService = new MailService();
      var messageService = new MessageService();
      videoEncoder.mp4Encoded += mailService.onVideoEncoded;
      videoEncoder.mp4Encoded += messageService.onVideoEncoded;
      videoEncoder.Encode(video);
      Console.ReadKey();
   }
}
public class MP4 {
   public string Title { get; set; }
}
public class MP4Args : EventArgs {
   public MP4 mp4 { get; set; }
}
public class MP4EncoderNew {
   public EventHandler mp4Encoded;
   public void Encode(MP4 video) {
      Console.WriteLine("Encoding MP4");
      Thread.Sleep(3000);
      OnVideoEncoded(video);
   }
   protected void OnVideoEncoded(MP4 video) {
      if (mp4Encoded != null) {
         mp4Encoded(this, new MP4Args() { mp4 = video });
      }
   }
}
//Subscriber 1
public class MailService {
   public void onVideoEncoded(object source, MP4Args e) {
      Console.WriteLine("Mail Service:,Sending an email {0}", e.mp4.Title);
   }
}
//Subscriber 2
public class MessageService {
   public void onVideoEncoded(object source, MP4Args e) {
      Console.WriteLine("Message Service:,Sending an Message {0}", e.mp4.Title);
   }
}

输出

Encoding MP4
Mail Service:,Sending an email Eminem
Message Service:,Sending an Message Eminem

更新于:05-Aug-2020

2K+ 浏览量

开启你的 职业生涯

完成课程以获得认证

开始
广告