C#事件学习3

 

基本处理过程如下所示:

首先,应用程序创建一个可以引发事件的对象;

接着,应用程序订阅事件;

引发事件后,就通知订阅器;

处理事件,需要提供一个事件处理方法来订阅事件,该方法的返回类型和参数应该匹配事件指定的委托。

namespace Eventlearn
{

    public delegate void MessageHandler(string messageText);
    //在定义事件前,必须先定义一个委托类型,以用于该事件,委托类型指定了事件处理方法必须拥有的返回类型和参数

    //这个委托类型称为MessageHandler,是void 函数的签名,它有一个string 参数。使用这个参数可以把Connection 对象收到的即时消息发送给Display 对象。定义了委托(或者找到合适的现有委托)后,就可以把事件本身定义为Connection 类的一个成员.


    //创建connection对象,该对象引发由Display对象处理的事件。
    public class Program
    {
           static void Main()
        {
               Connection myConnection=new Connection ();
               Display myDisplay=new Display ();
               myConnection .MessageArrived +=new MessageHandler(myDisplay.DispalyMessage);//后面是处理方法的名称             
               myConnection .Connect ();
               Console.WriteLine("hello");
               Console.ReadKey ();

        }
    }


    public class Connection
    {
        public event MessageHandler MessageArrived;
        //将创建的委托与特定的事件相连
        //定义了委托(或者找到合适的现有委托)后,就可以把事件本身定义为Connection 类的一个成员:
        //给事件命名(这里使用名称MessageArrived),在声明时,使用event 关键字,并指定要使用的委(前面定义的MessageHandler 委托类型)。以这种方式声明了事件后,就可以引发它,方法是按名称来调用它,就好像它是一个其返回类型和参数是由委托指定的方法一样。
        
        private Timer pollTimer;
        //在这个注册函数中,注册了Elapsed 事件的一个事件处理程序,每当调用这个处理程序方法CheckForMessage()的次数达到10 次后,就会引发一个事件。
        public Connection()
        {
            pollTimer = new Timer(100);
            pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);//10次后引发事件
        }
        public void Connect()
        {
            pollTimer.Start(); 
        }
        public void Disconnect()
        {
            pollTimer.Stop();
        }
        private static Random random = new Random();

        //注册了Elapsed事件的事件处理程序,
        private void CheckForMessage(object source,ElapsedEventArgs  e)
        {
            Console.WriteLine("Check for new Message:");
            //这里还提供了其他逻辑,只有表达式MessageArrived != null 为true,才引发一个事件。这个表达式也使用了委托语法,但语法略有不同,其含义是“事件是否有订阅者?”。如果没有订阅者,MessageArrived 就是null,也就不会引发事件。
            if((random.Next (9)==0)&&(MessageArrived !=null))//没有订阅,MessageArrived==null
            {
                MessageArrived("Hello Mum !");  //引发这个事件 
            }
        }
    }


    //这个方法匹配于委托类型(而且是公共的,如果类不是生成该事件的类,则其事件处理程序就必须是公共的),所以可以用它来响应MessageArrived 事件。
    //订阅事件的类是Display,它包含一个方法DisplayMessage(),
    public class Display
     {
         public void DispalyMessage(string Message)
         {
             Console.WriteLine ("Message arrived:{0}",Message);
         }
     }
}


事件的含义
事件类似于异常,因为它们都由对象引发(抛出),我们可以提供代码来处理事件。但它们也有几个重要的区别。最重要的区别是并没有与try ... catch 类似的结构来处理事件,而必须订阅(subscribe)它们。订阅一个事件的含义是提供代码,在事件发生时执行这些代码,它们称为事件处理程序。


单个事件可供多个处理程序订阅,在该事件发生时,这些处理程序都会被调用,其中包括引发该事件的对象所在的类中的事件处理程序,但事件处理程序也可能在其他类中。
事件处理程序本身都是简单的方法。对事件处理方法的唯一限制是它必须匹配于事件所要求的返回类型和参数。这个限制是事件定义的一部分,由一个委托指定。

.多用途的事件处理程序
前面 Timer.Elapsed 事件的委托包含了事件处理程序中常见的两类参数,如下所示:
. object source——引发事件的对象的引用
. ElapsedEventArgs e——由事件传送的参数
在这个事件(以及许多其他的事件)中使用object 类型参数的原因是,我们常常要为由不同对象引发的几个相同事件使用同一个事件处理程序,但仍要指定哪个对象生成了事件。

前面的所有事件处理程序都使用void 类型的返回值。可以为事件提供返回类型,但这会出问题。这是因为引发给定的事件,可能会调用好几个事件处理程序。如果这些处理程序都返回一个值只允许访问由事件处理程序最后返回的那个值,也就是最后一个订阅该事件的处理程序返回的值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习C#上位机开发时,以下是一个可能的学习路线: 1. 基础知识:首先,你需要掌握C#的基础知识,包括语法、数据类型、变量、运算符等。你可以通过阅读相关的教程或参加在线课程来学习这些基础知识。 2. Windows窗体应用程序:了解和掌握Windows窗体应用程序的开发是C#上位机开发的基础。你可以学习如何创建窗体、添加控件、处理事件等。这将帮助你构建用户界面和与用户交互。 3. 数据库操作:学习如何使用C#与数据库进行交互是非常重要的。你可以学习ADO.NET或Entity Framework等技术来连接和操作数据库。这将使你能够存储和检索数据。 4. 网络通信:掌握网络通信是上位机开发中的关键技能。你可以学习Socket编程或使用.NET提供的网络库来实现与其他设备或服务器的通信。 5. 多线程编程:在上位机开发中,多线程编程是常见的需求。学习如何使用C#编写多线程应用程序,以提高性能和响应能力。 6. 数据可视化:学习如何使用图表、图形和其他可视化工具来展示数据。这将使你能够更好地理解和分析数据。 7. 第三方库和框架:C#有许多强大的第三方库和框架可供使用,如WPF、ASP.NET、WinForms等。学习如何使用这些库和框架可以提高你的开发效率和应用程序的功能。 8. 实践项目:最后,通过实践项目来巩固所学知识。尝试开发一些小型的上位机应用程序,如数据采集、监控系统等。这将帮助你将理论知识应用到实际项目中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值