C# EventHandler事件的发布-订阅

C#的EventHandler默认两个参数,第一个参数是事件的发送者(object类型),第二个参数是事件所包含的数据(EventArgs类型),并且返回值为void。如果需要传递其他类型的数据,可以使用泛型委托EventHandler<XX>。

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 定义_发布_订阅事件
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //调用事件(发布者)
            PublishEvent publishEvent = new PublishEvent();
            SubscribeEvent subscribeEvent = new SubscribeEvent(publishEvent); //订阅者1
            SubscribeEvent subscribeEvent2 = new SubscribeEvent(publishEvent); //订阅者2

            while (true)
            {
                ConsoleKeyInfo consoleKeyInfo = Console.ReadKey();
                if (consoleKeyInfo.KeyChar == 's') { break; }

                if (Thread.CurrentThread.Name == null) { Thread.CurrentThread.Name = "主"; };

                if (consoleKeyInfo.KeyChar == 'p') //普通通知订阅者
                {
                    publishEvent.Publish();
                }
                else if (consoleKeyInfo.KeyChar == 't') //线程通知订阅者
                {
                    Thread thread = new Thread(() =>
                    {
                        publishEvent.Publish();
                    }
                    );
                    thread.Name = "子";
                    thread.Start();

                }


            }
        }
    }
    
    //定义事件参数
    public class MyPublishEventArgs : EventArgs
    {
        public string InfoString { get; set; }
    }
    //发布者
    public class PublishEvent
    {
        public event EventHandler<MyPublishEventArgs> OnPublish;
        public void Publish()
        {
            OnPublish?.Invoke(this, new MyPublishEventArgs() { InfoString = "hello " + Thread.CurrentThread.Name });//通知订阅者
        }
    }
    //订阅者
    public class SubscribeEvent
    {
        public SubscribeEvent(PublishEvent publishEvent)
        {
            publishEvent.OnPublish += Subscribe;
        }
        public void Subscribe(Object sender, MyPublishEventArgs args)
        {
            Console.WriteLine($"我接收到的消息是:{args.InfoString}");
        }
    }
}

 按p主线程触发事件,按t子线程触发事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C# 中的 EventHandler 是一种委托类型,用于实现订阅发布模式。订阅发布模式是一种常用的软件设计模式,它允许多个对象之间进行松耦合的通信,即发布者(Publisher)发布消息,订阅者(Subscriber)订阅消息并接收。 在 C# 中,使用 EventHandler 定义事件,可以通过 += 运算符订阅事件,也可以通过 -= 运算符取消订阅事件。当事件发生时,所有订阅者都会收到通知并执行其注册的处理程序。 例如,以下代码演示了如何定义一个事件订阅它: ``` class Program { static void Main(string[] args) { MyPublisher publisher = new MyPublisher(); MySubscriber subscriber = new MySubscriber(); publisher.MyEvent += subscriber.OnMyEvent; publisher.DoSomething(); } } class MyPublisher { public event EventHandler MyEvent; public void DoSomething() { Console.WriteLine("Publisher is doing something..."); MyEvent?.Invoke(this, EventArgs.Empty); } } class MySubscriber { public void OnMyEvent(object sender, EventArgs e) { Console.WriteLine("Subscriber is handling the event..."); } } ``` 在上面的代码中,MyPublisher 定义了 MyEvent 事件,并在 DoSomething 方法中触发该事件。MySubscriber 订阅了 MyEvent 事件,并在 OnMyEvent 方法中处理该事件。当调用 publisher.DoSomething() 方法时,会触发 MyEvent 事件并通知 MySubscriber 执行 OnMyEvent 方法。 需要注意的是,事件订阅和取消订阅必须在相同的作用域中进行。在上面的代码中,订阅和取消订阅都是在 Main 方法中进行的。如果将订阅操作移到 MySubscriber 类中,将会得到编译错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值