C# event 的一个例子

using System;
class EventClass
{
    //step1:create custom event args class(skip if system:EventArgs is used)
#region custom event args class
    public class EventNameEventArgs:EventArgs
    {
        public string SenderID;
        public string EventID;
        public EventNameEventArgs(string SenderID,string EventID)
        {
            this.SenderID = SenderID;
            this.EventID = EventID;
        }
    }
#endregion custom event args class
    //step2:declare custom event delegate(skip if system:EventHandler is used)
    #region custom event delegate
    public delegate void EventNameEventHandler(object sender, EventNameEventArgs e);
    #endregion custom event delegate
    //step3: create event declaration(EventName) and a method(OnEventName) that raises the event
        public event EventNameEventHandler EventName;    //event delegate member
        protected virtual void OnEventName(EventNameEventArgs e)   //method to invoke the event delegate member
        {
            if (EventName != null)   //if event delegate member is hooked with some function
            {
                EventName(this, e);//invoking the event delegate member and passing the event args
            }
        }
}//class EventClass

//event-raising class, derived from EventName Class, to call protected "OnEventName" method in due time
//("WHEN TO RAISE")
#region event-raising class
class EventRaisingClass:EventClass
{
    protected string EventRaiserClassID;
    public EventRaisingClass(string EventRaiserClassID)
    {
        this.EventRaiserClassID = EventRaiserClassID;
    }
    //method to raise the event while passing certain event args
    public void RaiseEvent(string EventID)
    {
        EventNameEventArgs e = new EventNameEventArgs(this.EventRaiserClassID,EventID);  //encapsulate the event parameters in the custom args
        OnEventName(e);  //raise the event
    }
}
#endregion event-raising class

//EventRecieverClass with EventProcess method
#region event-reciever class
class EventRecieverClass
{
    public EventRecieverClass(EventRaisingClass EventRaiser)
    {
        RegisterEvent(EventRaiser);
    }
    public void RegisterEvent(EventRaisingClass EventRaiser)
    {
        EventRaiser.EventName += new EventClass.EventNameEventHandler(EventProcess);  //hook EventRaiser with EventReciever
    }
    void EventProcess(object sender, EventClass.EventNameEventArgs e)
    {
        Console.WriteLine("Event {0} is raised by Sender {1} ! ",e.EventID,e.SenderID);   //事件响应函数
    }
    public void UnregisterEvent(EventRaisingClass EventRaiser)
    {
        EventRaiser.EventName -= new EventClass.EventNameEventHandler(EventProcess);
    }
}
#endregion event-reciever class
#region Application class
class App
{
    public static void Main()
    {
        //instantiate event-raising class
        EventRaisingClass EventSender1 = new EventRaisingClass("发送者1");
        EventRaisingClass EventSender2 = new EventRaisingClass("发送者2");
        //instantiate event-reciever class
        EventRecieverClass EventReviever1 = new EventRecieverClass(EventSender1);  //hooked with EventSender1 when instantiating
        EventSender1.RaiseEvent("事件1");
        EventSender1.RaiseEvent("事件2");
        EventSender2.RaiseEvent("事件3");
        EventReviever1.RegisterEvent(EventSender2);
        EventSender2.RaiseEvent("事件4");
        EventSender1.RaiseEvent("事件5");
        EventReviever1.UnregisterEvent(EventSender1);
        EventSender1.RaiseEvent("事件6");
        EventSender2.RaiseEvent("事件7");
        EventSender2.RaiseEvent("事件8");
        EventReviever1.UnregisterEvent(EventSender2);
        EventSender1.RaiseEvent("事件9");
        EventSender2.RaiseEvent("事件10");
        Console.ReadKey();
    }
}
#endregion Application class

### C# 中事件的用法与示例C# 中,`event` 是一种用于实现发布/订阅模式的关键特性。它允许对象通知其他对象某些特定的操作已经发生。以下是关于 `event` 的基本概念及其使用的详细介绍。 #### 定义事件 事件基于委托(delegate),因此定义事件的第一步是声明一个合适的委托类型。通常情况下,会使用标准的 .NET 委托签名来处理事件,即 `EventHandler<T>` 或其泛型版本 `EventHandler<EventArgs>` ```csharp // 使用 EventHandler 泛型版本作为基础 public class CustomEventArgs : EventArgs { public string Message { get; set; } } ``` 接着可以创建一个类并在此类中定义事件: ```csharp using System; public class EventPublisher { // 定义事件处理器类型的字段 public event EventHandler<CustomEventArgs> OnEventOccurred; protected virtual void RaiseEvent(string message) { // 创建自定义参数 var args = new CustomEventArgs() { Message = message }; // 调用事件 OnEventOccurred?.Invoke(this, args); } public void TriggerEvent() { // 触发事件的方法 RaiseEvent("An event has been triggered!"); } } ``` 上述代码展示了如何通过调用 `RaiseEvent()` 方法触发事件,并传递必要的数据给监听者[^3]。 #### 订阅和取消订阅事件 为了响应某个对象上的事件,另一个对象可以通过注册该事件来进行订阅。下面是一个简单的例子展示如何订阅以及取消订阅事件: ```csharp class Program { static void Main(string[] args) { EventPublisher publisher = new EventPublisher(); // 添加事件处理程序 (订阅) publisher.OnEventOccurred += Publisher_OnEventOccurred; Console.WriteLine("Before triggering the event:"); publisher.TriggerEvent(); // 移除事件处理程序 (取消订阅) publisher.OnEventOccurred -= Publisher_OnEventOccurred; Console.WriteLine("\nAfter unsubscribing from the event:"); publisher.TriggerEvent(); } private static void Publisher_OnEventOccurred(object sender, CustomEventArgs e) { Console.WriteLine($"Received event with message: {e.Message}"); } } ``` 当运行此程序时,在第一次触发事件之前已成功订阅的情况下,控制台将显示接收的消息;而在第二次触发前由于已经取消了订阅,则不会有任何输出[^4]。 #### 处理线程安全问题 如果多个线程可能同时访问同一个事件实例,则需要考虑同步机制以防止竞争条件等问题的发生。虽然现代框架提供了许多内置解决方案简化多线程环境下的操作,但在手动管理资源时仍需小心谨慎[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值