C#的事件处理机制

在以往的关于事件处理的程序中,我们更多的是采用一种循环等待的方式,即为了检测某个事件是否发生,循环的检测某个变量是否发生变化但这样会占用大量的资源。而C#   的事件处理机制提供了一种非常好的解决方案。程序不再不停的检查设备,而是等待消息的到来,然后交给程序来处理他它。这样的话,操作系统中只是傻瓜式的将消息传递给对象,由对象的事件驱动程序确定该怎么做。

我们先来介绍一下什么是事件:

事件就是一种消息通知,它是对象之间传递消息的一种方式。事件是类的一种成员。使用Event声明事件。C#采用一种称作:“发布”-“登记”-“接受”的逻辑来在对象之间传 递消息,通知某个事件的发生。  

接着,我们要来介绍一下什么是事件的委托,简单的说,委托就是一种面向对象的安全的函数指针。具体点:我们定义了两个类,一个用来发布事件,一个用来接收事件,但是发送方如何知道那个接收方将接受这个消息呢。这样的话,我们就需要在这两者之间创造一种媒介,这个媒介就是委托。

接着。我们来用代码的形式研究一下:

事件的发布者:

public class SomeSenderClass
{
    //事件声明
    public event SomeEventHandler SomeEvent;
    //通知事件登记对象
    protected virtual void OnSomeEvent(SomeEventArgs e)
    {
        if (SomeEvent != null)
            SomeEvent(this, e);
    }
    //模拟事件
    public void SomeTiggerMethod()
    {
        //实例化事件参数
        SomeEventArgs e = new SomeEventArgs();
        //触发事件
        OnSomeEvent(e);
    }
}
事件的接收者:

public class SomeReceiverClass
{
    public void SomeEventProcessMethod(
    object sender, SomeEventArgs e)
    {
        Console.WriteLine("响应SomeEvent事件");
    }
}

登记和触发事件代码的形式:


public class SomeApp {
public static Main(string[] args) {
//实例化事件接受者
SomeReceiverClass myReceiver = new SomeReceiverClass();
//实例化事件发送者
SomeSenderClass mySender = new SomeSenderClass ();
//登记事件
mySender.SomeEvent += new
SomeEventHandler( myReceiver.SomeEventProcessMethod);
}
}
这样我们基本理解了C#事件处理的流程。

附上一个写的较好的处理按键事件处理的程序,来帮助我们理解C#事件处理。

using System;
internal class KeyEventArgs : EventArgs
{
    private char keyChar;
    public KeyEventArgs(char keyChar)
        : base()
    {
        this.keyChar = keyChar;
    }

    public char KeyChar
    {
        get
        {
            return keyChar;
        }
    }
}
internal class KeyInputMonitor
{
    // 创建一个委托,返回类型为void,两个参数
    public delegate void KeyDownHandler(object sender, KeyEventArgs e);
    // 将创建的委托和特定事件关联,在这里特定的事件为KeyDown
    public event KeyDownHandler KeyDown;

    public void Run()
    {
        bool finished = false;
        do
        {
            Console.WriteLine("Input a char");
            string response = Console.ReadLine();

            char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);

            // 得到按键信息的参数
            KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
            // 触发事件
            KeyDown(this, keyEventArgs);

        } while (!finished);
    }
}
internal class EventReceiver
{
    public EventReceiver(KeyInputMonitor monitor)
    {
        // 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
        monitor.KeyDown += new KeyInputMonitor.KeyDownHandler(this.OnKeyDown);
    }
    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        // 真正的事件处理函数
        Console.WriteLine("Capture key: {0}", e.KeyChar);
    }
}
public class MainEntryPoint
{
    public static void Main(string[] args)
    {
        // 实例化一个事件发送器
        KeyInputMonitor monitor = new KeyInputMonitor();
        // 实例化一个事件接收器
        EventReceiver eventReceiver = new EventReceiver(monitor);
        // 运行
        monitor.Run();
    }
}


参考自: http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C# 中,可以通过事件来触发其他事件。这可以通过在事件处理程序中调用其他事件的委托来实现。下面是一个简单的示例: ```csharp using System; public class EventExample { // 声明事件和对应的委托 public event EventHandler FirstEvent; public event EventHandler SecondEvent; // 触发第一个事件 public void TriggerFirstEvent() { OnFirstEvent(EventArgs.Empty); } // 触发第二个事件 public void TriggerSecondEvent() { OnSecondEvent(EventArgs.Empty); } // 调用第一个事件的委托 protected virtual void OnFirstEvent(EventArgs e) { FirstEvent?.Invoke(this, e); } // 调用第二个事件的委托 protected virtual void OnSecondEvent(EventArgs e) { SecondEvent?.Invoke(this, e); } } public class Program { public static void Main(string[] args) { EventExample example = new EventExample(); // 订阅第一个事件 example.FirstEvent += (sender, e) => { Console.WriteLine("First event triggered"); }; // 在第一个事件触发时,触发第二个事件 example.FirstEvent += (sender, e) => { Console.WriteLine("Second event triggered from first event"); example.TriggerSecondEvent(); }; // 订阅第二个事件 example.SecondEvent += (sender, e) => { Console.WriteLine("Second event triggered"); }; // 触发第一个事件 example.TriggerFirstEvent(); } } ``` 在上面的示例中,我们定义了两个事件 `FirstEvent` 和 `SecondEvent`,并在 `Main` 方法中订阅和触发这些事件。当第一个事件触发时,它会调用第二个事件的委托,从而触发第二个事件。输出结果将是: ``` First event triggered Second event triggered from first event Second event triggered ``` 这样,通过在事件处理程序中调用其他事件的委托,我们就可以实现一个事件触发其他事件机制

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值