C#中的触发事件

         周末的时候老师给出了一道题:编程鲁提辖拳打镇关西,倒了桌子,碎了碗。刚看到题时就蒙了,对于似初学者的我来说我甚至连题都看不懂,后来老师提示说前几天不是让你看了事件和委托了吗?这一题用到的就是这个啊,再回过头来想想不正是么:再加上一个触发事件这道题就解决了啊,你看鲁提辖拳打镇关西这一事件触发了桌子倒了,桌子倒了又使得杯子掉地上碎了。然后就有了这道题的程序,嘻嘻,编程还是在生活中的呢,也没有想象中的那么枯燥么。。。。

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

namespace Consolechufa
{
    class luzhisen
    {
        public delegate void Zhenguanxi();//声明事件所需的代理      
        public event Zhenguanxi Dazhenguanxi;//事件的声明
        
        public void issue()//触发事件
        {
            if (Dazhenguanxi != null)
            {
                Console.WriteLine("鲁提辖拳打镇关西!");
                Console.ReadLine();
                Dazhenguanxi();
            }
        }      
    }
    class Table
    {
        public delegate void TableD();//声明事件所需的代理
        public event TableD TableDown;//事件的声明
        public void Houguo()
        {
            Console.WriteLine("桌子倒了");
            Console.ReadLine();
        }
        public void issue()
        {
            if (TableDown != null)
            {
                Console.WriteLine("桌子倒了");
                Console.ReadLine();
                TableDown();
            }
        }
    }
    class Cup
    {
        public void Houguo()
        {
            Console.WriteLine("杯子碎了");
            Console.ReadLine();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            luzhisen lzs = new luzhisen();
            Table T = new Table();
            Cup C=new Cup();
            lzs.Dazhenguanxi += new luzhisen.Zhenguanxi(T.Houguo);
            lzs.issue();//鲁提辖拳打镇关西触发桌子倒了事件
            T.TableDown += new Table.TableD(C.Houguo);
            T.issue();//桌子倒了事件触发杯子碎了事件
        }
    }
}


 

C#事件是一种特殊的多播委托,它可以由一个对象引发,并由一个或多个其他对象订阅。事件常用于实现解耦合的组件间的通信。当某个特定的事情发生时(比如按钮点击、数据到达、任务完成等),事件触发,相应的事件处理程序被调用。 多线程环境事件处理需要特别注意线程安全问题。当事件触发时,如果事件处理程序在不同的线程运行,可能会出现访问冲突或资源竞争的情况。为了避免这些问题,通常需要使用线程同步机制,例如使用 `lock` 语句或者 `Monitor` 类来确保在任何时候只有一个线程能够访问共享资源。 一个简单的多线程事件触发的例子如下: ```csharp public class EventPublisher { // 定义事件 public event EventHandler MyEvent; // 触发事件的方法 public void TriggerEvent() { // 检查是否有订阅者 if (MyEvent != null) { // 使用线程安全的方式触发事件 lock (this) { MyEvent(this, EventArgs.Empty); } } } } public class EventSubscriber { // 订阅事件 public void Subscribe(EventPublisher publisher) { publisher.MyEvent += HandleEvent; } // 事件处理程序 private void HandleEvent(object sender, EventArgs e) { Console.WriteLine("事件触发,当前线程ID: " + Thread.CurrentThread.ManagedThreadId); } } // 使用 public static void Main() { var publisher = new EventPublisher(); var subscriber = new EventSubscriber(); subscriber.Subscribe(publisher); // 启动一个新线程来触发事件 new Thread(new ThreadStart(() => { publisher.TriggerEvent(); })).Start(); // 主线程也尝试触发事件 publisher.TriggerEvent(); } ``` 在这个例子,`EventPublisher` 类有一个事件 `MyEvent`,它在 `TriggerEvent` 方法触发。`EventSubscriber` 类订阅了这个事件,并提供了一个处理程序 `HandleEvent`。在 `Main` 方法,我们创建了发布者和订阅者,并在两个不同的线程触发事件。 需要注意的是,在多线程环境事件的处理程序应尽可能快速执行,以避免阻塞其他线程对事件的处理。如果需要执行耗时的操作,应该考虑使用任务并行库(TPL)或其他异步模式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值