`
wyf
  • 浏览: 437927 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

发布基于 EventHandler 模式的事件

    博客分类:
  • C#
阅读更多

一、随事件一起发送自定义数据且不使用泛型

1、如果随事件一起发送自定义数据,将自定义数据的类声明为对发布服务器和订阅者类均可见的范围。 然后添加所需成员以保留自定义事件数据。 在此示例中,将返回一个简单的字符串。

public class CustomEventArgs : EventArgs  
{  
    public CustomEventArgs(string s)  
    {  
        msg = s;  
    }  
    private string msg;  
    public string Message  
    {  
        get { return msg; }  
    }   
}

 2、声明发布类中的委托。 为以 EventHandler 结尾的委托命名。 第二个参数指定自定义 EventArgs 类型。

public delegate void CustomEventHandler(object sender, CustomEventArgs a);

 3、定义事件,将委托声明为类型。

public event CustomEventHandler RaiseCustomEvent;

 

二、如果不随事件发送自定义数据。

如果没有任何自定义 EventArgs 类,事件类型将为非泛型 EventHandler 委托。 你无需声明该委托,因为它已在创建 C# 项目时包括的 System 命名空间中声明。 将以下代码添加到发布服务器类。

public event EventHandler RaiseCustomEvent;

 三、随事件一起发送自定义数据且使用泛型。

则无需自定义委托。 而是在发布类中,将事件类型指定为 EventHandler<CustomEventArgs>,替换尖括号中自定义类的名称。

public event EventHandler<CustomEventArgs> RaiseCustomEvent;

 

示例

下例通过使用自定义 EventArgs 类和 EventHandler<TEventArgs> 作为事件类型来演示之前的步骤。

namespace DotNetEvents
{
    using System;
    using System.Collections.Generic;

    // Define a class to hold custom event info
    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            message = s;
        }
        private string message;

        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }

    // Class that publishes an event
    class Publisher
    {

        // Declare the event using EventHandler<T>
        public event EventHandler<CustomEventArgs> RaiseCustomEvent;

        public void DoSomething()
        {
            // Write some code that does something useful here
            // then raise the event. You can also raise an event
            // before you execute a block of code.
            OnRaiseCustomEvent(new CustomEventArgs("Did something"));

        }

        // Wrap event invocations inside a protected virtual method
        // to allow derived classes to override the event invocation behavior
        protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
        {
            // Make a temporary copy of the event to avoid possibility of
            // a race condition if the last subscriber unsubscribes
            // immediately after the null check and before the event is raised.
            EventHandler<CustomEventArgs> handler = RaiseCustomEvent;

            // Event will be null if there are no subscribers
            if (handler != null)
            {
                // Format the string to send inside the CustomEventArgs parameter
                e.Message += $" at {DateTime.Now}";

                // Use the () operator to raise the event.
                handler(this, e);
            }
        }
    }

    //Class that subscribes to an event
    class Subscriber
    {
        private string id;
        public Subscriber(string ID, Publisher pub)
        {
            id = ID;
            // Subscribe to the event using C# 2.0 syntax
            pub.RaiseCustomEvent += HandleCustomEvent;
        }

        // Define what actions to take when the event is raised.
        void HandleCustomEvent(object sender, CustomEventArgs e)
        {
            Console.WriteLine(id + " received this message: {0}", e.Message);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub1 = new Subscriber("sub1", pub);
            Subscriber sub2 = new Subscriber("sub2", pub);

            // Call the method that raises the event.
            pub.DoSomething();

            // Keep the console window open
            Console.WriteLine("Press Enter to close this window.");
            Console.ReadLine();

        }
    }
}

 

 

分享到:
评论

相关推荐

    04.C# 知识回顾 - Event 事件.pdf

    通过以上内容回顾,我们可以看到C#事件的使用涉及到了委托的定义、事件的发布、事件的订阅、自定义EventArgs类的创建,以及使用EventHandler模式和泛型版本的EventHandler来扩展.NET类库中的事件功能。掌握这些知识...

    事件驱动风格+观察者模式java

    事件驱动风格是一种编程范式,它基于事件发生的概念。在事件驱动系统中,程序的执行流程不是由主程序按照预定顺序执行,而是由外部事件(如用户点击、网络数据到达等)触发。当事件发生时,相应的事件处理器被调用来...

    利用发布者发布书籍,订阅者订阅书籍的事情来讲解C#的事件

    在C#编程中,事件(Event)是一种特殊的委托类型,它是.NET框架中多态通信的重要机制,常用于实现发布者/订阅者模式。这个模式中,“发布者”是触发事件的类,而“订阅者”是响应事件的类。在这个场景下,我们可以将...

    委托和事件还有Button事件于一体的观察者模式实例应用

    事件是基于委托的一种特殊类型,它是.NET框架中实现观察者模式的关键所在。事件提供了发布-订阅模型,允许一个对象(事件发布者)向多个对象(事件订阅者)发送消息而无需知道这些对象是谁。 **事件的定义:** ```...

    java中的事件机制

    Java中的事件机制是Java编程中一个重要的概念,它基于观察者模式(Observer Pattern)来实现对象之间的通信。观察者模式是一种行为设计模式,允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的...

    C# 接口事件示例程序

    事件通常用于发布者-订阅者模式,其中发布者触发事件,而订阅者通过事件处理程序响应这些事件。接口可以包含事件声明,但不能提供事件的实现。这样,实现接口的类必须提供事件的完整实现。 以下是创建接口事件的...

    C#版本EventBus事件总线实例源码-9s.rar

    事件总线是将事件发布和订阅模式应用于整个系统的一种机制。它充当一个中心平台,允许不同组件之间通过发布和订阅事件来进行通信,而无需直接引用彼此,从而降低组件间的耦合度。 在C#中,事件是基于委托(Delegate...

    C#发射调用dll的事件

    这种设计模式遵循发布/订阅原则,使得代码松耦合。 在插件架构中,事件可以用来传递信息,让主程序知道插件何时完成了某些操作或者需要主程序进行下一步处理。以下是一些关键步骤来实现这一目标: 1. **定义事件...

    Event Bus C# 事件总线

    事件总线是基于发布/订阅(Publish-Subscribe)模式的,其中事件发布者并不直接知道事件订阅者,而是通过事件总线来传递消息。这种方式降低了组件之间的依赖性,因为发布者只需要发布事件,而订阅者则可以独立地监听...

    EventBus.rar

    事件总线的核心思想是基于发布/订阅模式,它允许组件之间通过发布事件和订阅事件来传递信息,而无需知道彼此的具体身份或依赖关系。 发布/订阅模式是消息传递的一种方式,它将事件的生产者(发布者)与消费者(订阅...

    C#版本EventBus事件总线实例源码(0515).rar

    C#中的事件总线实现通常基于.NET框架的事件机制,这包括委托(Delegate)、事件(Event)和事件处理程序(EventHandler)。以下是一些关键知识点: 1. **委托(Delegate)**: 委托是C#中的类型安全的函数指针,它...

    事件与委托经典

    为了实现这一目的,C#引入了事件,它是基于委托的安全机制,确保只有发布事件的对象能触发事件,而订阅事件的对象只能响应事件,不能直接调用事件处理方法。这样,事件提供了一种封装和保护机制,避免了不必要的依赖...

    NET事件小实例

    .NET事件是.NET Framework中用于实现对象间通信的一种机制,它基于发布-订阅模式,使得一个对象(发布者)可以向其他对象(订阅者)发送通知,而无需知道这些订阅者是谁或者它们如何响应。在.NET中,事件通常与委托...

    多播事件总线 Avis源码

    事件总线是基于发布/订阅模式的一种设计,它作为一个中央调度者,负责处理事件的发布和订阅。在Java中,事件总线常用于解耦组件,使得系统中的各个部分可以通过事件进行交互,而不必知道具体发送事件的对象是谁。 ...

    C#版本EventBus事件总线实例源码

    EventBus是基于发布/订阅模式的通信方式,它充当了一个中间人角色,负责分发事件。发布者(Publisher)发布事件,而订阅者(Subscriber)注册对特定事件的兴趣。这种模式避免了对象之间的直接依赖,增强了系统的可...

    C#版本EventBus事件总线实例源码(经典)

    在软件开发中,事件总线(EventBus)是一种设计模式,用于在组件之间解耦通信,使得各个组件可以独立地发布和订阅事件,而无需直接引用对方。C#作为.NET框架的主要编程语言,同样支持实现事件总线的概念。下面将详细...

    基于OSGi的热插拔观察者模式

    4. **实现观察者**:在其他Bundle中,创建一个实现了相应事件处理接口的类,比如`EventHandler`,这个类就是观察者。 5. **监听服务**:在观察者的Bundle中,通过Service Tracker监听`EventService`的变化。当新的`...

    c# 事件传值

    在C#编程中,事件(Event)是一种特殊的委托类型,用于在对象间传递...在实际项目中,根据需求选择合适的事件设计模式,如发布/订阅(Publisher/Subscriber)或命令(Command)模式,可以提高代码的可维护性和扩展性。

    委托与事件

    5. 事件最佳实践:为了遵循SOLID原则,事件通常遵循发布-订阅模式,允许对象间松耦合。事件发布者不应知道订阅者的具体实现,而订阅者也不应依赖于发布者的内部状态。 三、应用场景 1. UI编程:在WPF或Windows ...

Global site tag (gtag.js) - Google Analytics