C#中消息处理机制(事件与委托)

C# 技术探索:消息队列、多线程、回滚、并行编程、异步编程反射 消息队列:解耦系统组件,提高系统的伸缩性容错性。多线程并行编程:利用多核 CPU 提高系统处理能力,特别适用于计算密集型或并发任务。回滚机制:确保系统在出现异常时能恢复到一致性状态。异步编程:提高系统的响应性,特别是在 I/O 密集型操作中。反射:动态操作对象类型,提供灵活的运行时功能。这些技术在现代 C# 开发中都有着广泛的应用,掌握它们能够帮助开发者处理更复杂和高效的编程任务。 阅读详情

编写过Windows桌面应用程序的人都知道,微软的Windows操作系统与应用程序之间的通信绝大部分是基于消息循环机制的。在VC++中,程序使用GetMessage,TranslateMessage,DispatchMessage语句从消息队列中获取消息,转换消息并且将消息分发到目标窗口的过程函数,并由过程函数对不同的Windows消息进行分别处理。

当你将开发平台转向C#的时候,由于C#对消息进行了面向对象的封装,消息被封装成了事件,使我们对消息传送机制的理解蒙上了一层迷雾,下面我们就从实际的代码着手,抽丝剥茧,逐步了解C# WinForm中的消息处理机制.当我们新建一个WinForm程序后在Program.cs中我们看到Application.Run(new Form1());Application类具有用于启动和停止应用程序和线程以及处理Windows消息的方法。通过此语句,当前线程上开始运行标准应用程序消息循环,并使指定窗口可见,消息循环被封装进了Application类的Run()静态方法中。程序结束时调用Exit或者ExitThread来停止消息循环,程序也就随之终止。  

我们为Form1窗体中创建鼠标点击事件MyClick,程序自动为我们增加一些代码。this.MouseClick+=newSystem.Windows.Forms.MouseEventHandler(this.MyClick);上面this.MouseClick是C#中定义的鼠标单击事件。它被定义为: public event MouseEventHandler MouseClick;而MouseEventHandler的定义是publicdelegate void MouseEventHandler(object sender, MouseEventArgs e);该语句定义了一个名为MouseEventHandler的委托,那什么是委托呢?  委托类型可以理解成在C++中的函数指针,但不同的是,委托是完全面向对象的,同时封装了对象的实例和方法。本质上,委托把一个实例和该实例上的方法函数封装成一个可调用的实体,它是面向对象的、安全的.我们可以把第一句代码理解成为this.MouseClick事件添加了一个指向MyClick处理函数的函数指针。C#中事件的处理方法需要使用委托类型对事件进行注册.当然,你也可以再次调用这句语句对事件添加另一个处理函数如MyClick2,这些对该事件的处理会形成处理函数列表。则在程序运行过程中点击鼠标后在完成MyClick函数后会继续运行MyClick2函数。

由上我们可以大致猜测其封装过程: 

Application类将对象发送过来的消息从应用程序消息队列中提取出来后,分发到相应的窗体,并转换成事件。NET框架定义了一个特殊的类型(Delegate委托),该类型提供函数指针的功能。这样,委托就等效于一个类型安全的函数指针或一个回调函数。C#中通过Delegate委托机制将事件与响应函数的函数地址关联起来,并形成一种函数指针列表,当消息到来的时候,即可通过这些函数指针列表逐一调用这些响应函数。我们通过以下方法自定义一个事件触发,来验证我们以上的猜测。我们通过手动添加代码来实现自定义的代理事件(同VC++中的自定义消息) 

1、声明事件委托。此处int para仅是方便实验,代表所需要的参数列表,但要注意参数列表需要和第3步的参数列表相统一。 public delegate void MyEventHandler(int para);

 2、声明事件,event 关键字用于在发行者类中声明事件,委托MyEventHandler作为事件的类型。 public event MyEventHandler MyEvent;

3、添加事件的处理程序(响应事件的方法)。public void OnMyEvent(int para) { MessageBox.Show(""事件触发,参数为:""+para);}

 4、将指定的事件处理程序邦定到要处理的事件上(订阅事件),注意,此语句需要写在程序执行语句中,如Form_Lord函数内。 this.MyEvent += new MyEventHandler(OnMyEvent);

 5、触发事件(调用事件的触发方法)。MyEvent(3); 

 6、通过事件委托的回调,执行我们需要的事件处理程序。弹出消息框“事件触发,参数为:3”。

 以上实验可以得出结论,C#中的消息通过Application转换成事件以后,通过以上6个步骤完成了事件与处理程序之间的对应关系,在用户触发事件以后,相应的时间处理程序得到准确执行。也可通过以上方法,增加用户自定义事件。

 


大语言模型的三种主要架构 Decoder-Only、Encoder-Only、Encoder-Decoder f基于 Transformer 模型以非灰色显示:decoder-only 模型在蓝色分支,encoder-only 模型在粉色分支,encoder-decoder 模型在绿色分支。模型在时间线上的垂直位置表示它们的发布日期。开源模型由实心方块表示,而闭源模型由空心方块表示。右下角的堆积条形图显示了各公司和机构的模型数量。从时间轴上,我们可以看到:2021年前,当 OpenAI 决定在,他们实际上是在逆流而上。 阅读详情

相关推荐

基于matlab的图像HOG特征提取算法仿真

方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 698

C# Message (消息机制)

Windows下应用程序的执行是通过消息驱动的。消息是整个应用程序的工作引擎,我们需要理解掌握我们使用的编程语言是如何封装消息的原理。

C#委托事件深度解析及WndProc应用实战

C#中,使用delegate关键字可以显式声明一个委托类型。该类型用于描述一组具有相同参数列表和返回类型的可调用方法。其基本语法如下:public delegate 返回类型 委托(参数列表);例如,定义一个计算两个整数之和的委托:上述代码定义了一个名为的委托类型,它可以引用任何接受两个int参数并返回int类型值的方法。// 在主程序中使用委托// 调用Add方法// 输出:15// 方法组转换// 输出:5逻辑分析- 第一行。

weixin_42513870的博客 968

SendMessage用法

函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。该函数是应用程序和应用程序之间进行消息传递的主要手段之一。函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);参数:hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADC...

javahigh1 2049

C# 基于微服务开发框架的设计思路()-微服务消息机制

微服务的消息处理机制的建立,内部消息、外部消息、消息应用

1541

c#中的消息处理函数和vc中的消息处理函数区别

c#

u011555996的博客 756

()c#消息处理

一、消息概述 Windows下应用程序的执行是通过消息驱动的。消息是整个应用程序的工作引擎,我们需要理解掌握我们使用的编程语言是如何封装消息的原理。 1 什么是消息(Message) 消息就是通知和命令。在.NET框架类库中的System.Windows.Forms命名空间中微软采用面对对象的方式重新定义了Message。新的消息(Message)结构的公共部分属性基...

anivdqdt84098的博客 631

C#中的事件委托

事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂。而这些东西却往往又是编程中常用且非常重要的东西。大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来。先来看看事件编程有哪些好处。在以往我们编写这类程序中,往往采用等待机制,为了等待某件事情的...

weixin_34050427的博客 192

Window 消息——C#.NET消息机制

一、消息概述          众人周知,Window系统是一个消息驱动的系统, Windows操作系统本身有自己的消息队列,消息循环。它捕捉键盘、鼠标的动作,生成消息,并将这个消息传给应用程序的消息队列。余下的工作由应用程序负责处理, Windows 消息机制在这儿就不再讲述

1720

C#.NET 消息机制

一、消息概述      众人周知,window系统是一个消息驱动的系统, windows操作系统本身有自己的消息队列,消息循环,它捕捉键盘,鼠标的动作生成消息,并将这个消息传给应用程序的消息队列。 余下的工作有应用程序处理消息, windows 消息机制在这儿就不再讲述,我们重点讲述应用程序的消息机制。 大家只要明白消息是由操作系统传递给应用程序的。 一副图更能详细说明:应用程序的执行是通过消息驱动的。消息是整个应用程序的工作引擎,我们需要理解掌握我们使用的编程语言是如何封装消息的原理。1 什么是消息(Me

FANET 1万+

c#委托事件、消息、WndProc用法()

c#委托事件 心得c#委托来实现事件通知机制委托相当c++函数指针。整个过程涉及一个呼叫者,一个被呼叫者,还有就是这个委托。 - 实现步骤有以下几步: 1. 申明委托, 2.定义呼叫者和调用的函数, 3.定义被呼叫者和具体实现的函数(被调用的函数) 1.申明委托 ,在包里或者类里,publicpublic delegate void PlayGame(Object...

weixin_30670965的博客 220

【深入浅出C#】章节 6: 异常处理和调试:异常的概念和处理机制

C# 中,创建自定义异常类非常简单。你可以通过继承 Exception 类来定义自己的异常类。// 自定义异常类 public class MyCustomException : Exception {// 构造函数 public MyCustomException() {} // 带有异常消息的构造函数 public MyCustomException(string message) : base(message) {

喵叔 2288

C#消息处理机制

<br />一、消息概述 <br /><br />      Windows下应用程序的执行是通过消息驱动的。消息是整个应用程序的工作引擎,我们需要理解掌握我们使用的编程语言是如何封装消息的原理。 <br /><br /> 1 什么是消息(Message) <br /><br />      消息就是通知和命令。在.NET框架类库中的System.Windows.Forms命名空间中微软采用面对对象的方式重新定义了Message。新的消息(Message)结构的公共部分属性基本早期的一样,不过它是面

青青的专栏--C/C++ OOA/D Design Pattern 1420

C# 消息队列、多线程、回滚、并行编程、异步编程、反射

C# 中,你可以使用多个消息队列技术,其中一种广泛使用的技术是 RabbitMQ。RabbitMQ 是一个开源的消息代理,实现了高级消息队列协议(AMQP),提供了强大的功能来处理消息传递。在多线程编程中,处理逻辑涉及管理线程之间的同步、协作和临界区等问题。异步编程允许在等待某些长时间运行的操作完成时释放主线程,以避免阻塞用户界面或其他任务。多线程允许在同一时间执行多个独立的任务,以提高程序的效率和响应性。回滚是指撤销或取消已经执行的操作以返回到先前的状态。在 C# 中,你可以使用事务 (

weixin_41989626的博客 1616

事件和消息机制的理解

消息/事件机制是几乎所有开发语言都有的机制,并不是deviceone的独创,在某些语言称之为消息(Event),有些地方称之为(Message). 其实原理是类似的,只不过有些实现的方式要复杂一点。我们deviceone统一就叫消息. 消息基础概念 还有一些初学者不太熟悉这个机制,我们先简单介绍一些基础概念,如果熟悉的人可以跳过这个部分。一个/条消息可以理解为是一个数据结构,包含以下几个基本部...

weixin_34247299的博客 560

C# 消息处理学习总结

C# 收发和处理自定义的WINDOWS消息 http://blog.sina.com.cn/s/blog_45eaa01a01013zbs.html   为了程序启动后自动执行主函数,在Form1_Load中直接执行启动函数,可能造成没有 反应。当然,在Form1_Load中加入较长时间(比如2秒)的定时器,在定时器函数中关闭 定时器(仅需要执行一次),再执行主函数

bcbobo21cn的专栏 2790

产品质量不良成本表.doc

产品质量不良成本表.doc

上一篇: 如何一夜之间成为一个牛的软件开发者(转自一个国外的牛人)
hhh1108
博客等级 码龄17年 9粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值