当前位置: 首页 > 编程笔记 >

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

司马高昂
2023-03-14
本文向大家介绍如何在C#中订阅事件,我们可以在C#中为一个事件拥有多个订阅者吗?,包括了如何在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
 类似资料:
  • Node.js应用程序可以使用composer-client.BusinessNetworkConnection.onAPI调用从业务网络订阅事件。事件在业务网络模型文件中定义,并由交易处理函数文件中的指定交易处理。有关发布事件的更多信息,请参阅发布事件。 在你开始之前 在应用程序可以订阅事件之前,你必须定义一些事件和发送它们的交易。还必须部署业务网络,并且必须具有可连接到该业务网络的连接配置文件

  • 我正在用Scala编写一个GUI,在尝试在一个foreach语句中注册按钮事件时遇到了一个奇怪的问题:对于对象列表中的每个元素(对象0)…对象n),检索相应的按钮x=按钮i,并用代码框订阅给定框。listenTo(x)。按下按钮时,应执行与对象相关的一些操作(在这种情况下,): 但是,我得到了一些非常奇怪的行为,单击任何按钮都会触发所有此类对象操作——请参阅程序输出: 我完全不知道为什么会这样;无

  • 由于Guava的留档很短,我在这里问它: 是否有办法将事件分派给多个订阅者,或者事件总是由第一个合适的订阅者使用? 如果是后者,为了添加这样的功能或在自己的应用程序中实现整个事件总线逻辑,是否最好扩展EventBus类?

  • 我在IBM cloud IoT平台上有一个设备,我想订阅mendix的活动...我正在使用MQTT客户端表单mendix应用商店订阅设备事件。 项目资源管理器: MQTT订阅

  • 我正在寻找一种将多个订阅者附加到RxJava可观察流的方法,每个订阅者异步处理发出的事件。 我第一次尝试使用。flatMap(),但这似乎对任何后续订阅服务器都不起作用。所有订阅服务器都在同一线程上处理事件。 最终工作的是通过每次创建一个新的可观察的来消耗新线程中的每个事件: 输出: 以及多个订阅者的最终结果: 输出: 然而,这似乎有点笨拙。有没有更优雅的解决方案,或者RxJava不是一个很好的用

  • 我有一个类处理一个图像,这可能是一个缓慢的过程。当工作完成时,该类包含图像的一些特性,如主色。 我有许多其他的代码想知道主颜色,当他们要求它时,它可能是或可能没有准备好。 我还没有找到使用RXJava2实现这一点的简单方法。有人能帮帮我吗? null ReplaySubject似乎有一些我正在寻找的属性,但我不确定如何正确地实现它。