100分求解事件的含义,高手帮忙解释基本概念 哪位高手给写个并解释下什么是自定义事件,小弟对这块一直很模糊,最后写下声明的那条语句,并且每个单词都给出明确的解释,比如:+=号是绑定方法的意思吗?一直似懂非懂!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 按MSDN的解释,事件也就是向其他类或对象通知发生的相关事情,例如用户点击鼠标会发生Clcik事件,移动会产生Move事件。这些都是系统默认的事件,所以我们可以直接使用而不用管它什么时候触发。自定义事件就需要手工触发事件,也就是说在什么时候通知其他类或者对象发生了这件事。说得好乱,文字不是强项,不说了,看楼下的 事件就是基于windows消息处理机制的,当捕捉到特定的消息,事件便发生了。操作系统将消息传送给对象,而对象事先已经注册了事件的处理方法作为回调函数告诉操作系统。所以操作系统不必知道程序的内部工作机制,只要传递消息就可以。 //比如动态生成一个按钮 Button button1 = new Button(); // 产生一个事件处理的委托实例并添加到产生的事件列表中 button1.OnClick += new EventHandler( this.buttonClick ); //这里是真正处理事件的函数 private void buttonClick(object sender, KeyEventArgs e) { MessageBox.Show( "just click me"); } +=是添加一个处理函数如果直接用=会将默认的覆盖掉,所以一般用+=其实就当是普通的+=就好了int i = 1;i += 2; //i = 1 + 2;i = 2; // i = 2; 事件就是正在发生的,或即将发生的case。通过一些主动的或被动的动作去触了他。事件的发生要有一个生存时间的。关于具体的代码可以到百度知道上去搜搜看。 EventHandler是一个预定义的委托。public delegate void EventHandler(Object sender, EventArgs e);其实是定义了一个标准的windows事件回调函数的原型。如果要添加标准的事件处理,都可以直接按照这样原型来写事件处理函数。比如前面写的 private void buttonClick(object sender, KeyEventArgs e) { MessageBox.Show( "just click me"); }当你做的是自定义事件时,根据你的需要要传递的参数可能跟这个原型有所出入,这时候就需要你自己定义一个委托了。而你的事件处理函数也是依照你定义的委托来写。 事件就是一种通知机制,可以在必要的时候才触发某段代码执行..NET中的事件是基于委托的.+=就是添加一个事件/委托处理程序,它是delegate类中重载的运算符.你理解为Add就好了 系统默认的事件,应该是基于消息处理的,但自定义的事件,就需要一个触发的时机,例如: // 定义超时委托 delegate void Timeout(); // 定义超时事件 event Timeout TimeoutEven; // 事件处理函数 private void EventFunction() { m_iTimeout = 0; m_bPlay = false; MessageBox.Show("时间到了"); } private int m_iTimeout = 0; private bool m_bPlay = false; private void button1_Click(object sender, EventArgs e) { // 关联事件处理函数 TimeoutEven += EventFunction; m_bPlay = true; while (m_bPlay) { if (m_iTimeout >= 10) { // 事件到了,触发Timeout事件 if (TimeoutEven != null) { TimeoutEven(); } } System.Threading.Thread.Sleep(1000); Application.DoEvents(); m_iTimeout++; } } 事件就跟名字一样,名字就是自解释的。鼠标的点击、移动,键盘被按下、放开,所有控件属性的变化,还有来自端口的信息,只要发生了变化,就可以成为“事件”,并且传递相应的信息给系统。单纯的知道事件的发生是没有实际用途的,必须执行相应的动作,执行相应的代码,因此有了“委托”,就是告诉程序,发生了事件后应该做什么事情。一个事件可以对应多个委托以执行多个函数代码,“+=”就是你在一事件原有的委托基础上再添加多一个而已,执行的顺序等于你添加的顺序。如果你用“=”,那么就不是“添加”,而是赋值,会覆盖原有的所有委托。MSDN有关于事件和委托配合使用的专题,楼主自己去看看,例子都很简单的 自定义的事件也是基于消息处理的。这是它的本质。所谓触发的时机也不过是在适当的时候发送的消息。比如你在c#里用定时器,要触发一个事件。实质上是定时器是封装了setTimer这个api,它每隔一段inteval会发送一个WM_TIMER的消息。接收到这个消息之后,再去调setTimer的回调函数,即是你封装的TimeOutEvent要自定义消息也是可以的。不过c#比较麻烦,我就不写怎么做了。最后看了一下,ZengHD,觉得你写这个例子不太算事件。因为好像不是用真的定时器,而是模拟的,只是顺序执行一些函数而已,通过一些计数和sleep拖延了时间。我觉得不能算事件的。 呵呵,都是一个东西。只是事件让人感觉比较亲切,容易跟生活联系在一起容易理解吧。就好像char **argv 一般都写char argv[][]一样。本质都是同一个东西。 事件:就是一个特殊化的委托实例;特殊在什么地方呢?示例: //使用Action<T>委托 class A{ //为本类定义一个事件 public event Action<string> SendMessage; //按MSDN推荐,写了事件以后你需要写一个按一定模式它的触发如下; protected virtual void OnSendMessage(string message) { if(this.SendMessage!=null)//X1 处 this.SendMessage.Invoke(message); } } //下面我们将使用这个定义的事件"SendMessage", //注意使用事件的条件是,存在一个类的引用(包含关系),被包含者的事件被使用所以.. class B{ //申明A的对象: A a; public B(){ this.a=new A(); //实例化a之后接着,"订阅"它的事件用 "+="符号 this.a.SendMessage+=this.ShowMessage;//+=号之后,可以直接写一个方法名这样更简单 } void ShowMessage(string msg){ //你的在这里写你订阅事件的响应代码... MessageBox.Show(msg); } } //至此整个涉及事件的内容交待完毕,下面回过来讲一下,为什么说事件是一个特殊的委托 //它特殊在什么地方呢?个人认为是在这里;依然借用上面代码举例; //... //注意X1处,"this.SendMessage!=null",只有在定义事件的类的内部才可以设置事件 //是否为null除此之外的其它地方,只能存在+=,-=操作 //有关更多讯息请参考MSDN的帮助. 事件是windows的消息驱动机制中的一个概念,事件是一个对象对对象本身和外界对象的各种状态变化的感知,当它检测到这种状态变化之后,就会给该对象一个通知.(自己的理解,仅供参考) 事件是windows的消息驱动机制中的一个概念,事件是一个对象对对象本身和外界对象的各种状态变化的感知,当它检测到这种状态变化之后,就会给该对象一个通知.(自己的理解,仅供参考) button1.Click += delegate { button1.Text = "Clicked"; }; 出事了。就是事件-------------------------------------------------北京国展大型人才招聘会(9.27)http://www.315job.com/YaoQingHan/20080927.html while (m_bPlay) { if (m_iTimeout >= 10) { // 事件到了,触发Timeout事件 if (TimeoutEven != null) { TimeoutEven(); } } System.Threading.Thread.Sleep(1000); Application.DoEvents(); m_iTimeout++; }红星星高手,详细解释下这段代码的含义可以不,我只知道用,具体每句的含义不是太清楚。如System.Threading.Thread.Sleep(1000); Application.DoEvents();谢谢了 关于处理和引发事件:http://msdn.microsoft.com/zh-cn/library/edzehd2t.aspx,非常详细 事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。 在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。 委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。下面的示例显示了事件委托声明。 C# 复制代码 public delegate void AlarmEventHandler(object sender, AlarmEventArgs e); 该语法与方法声明的语法相似,但是 delegate 关键字通知编译器 AlarmEventHandler 是一个委托类型。按照约定,.NET Framework 中的事件委托有两个参数:引发事件的源和该事件的数据。 AlarmEventHandler 委托的实例可以绑定到任何一个与其签名匹配的方法上,例如下面的示例中显示的 WakeMeUp 类的 AlarmRang 方法。 public class WakeMeUp { // AlarmRang has the same signature as AlarmEventHandler. public void AlarmRang(object sender, AlarmEventArgs e) {...}; ... } 只有当事件生成事件数据时才需要自定义事件委托。许多事件,包括一些用户界面事件(例如鼠标单击)在内,都不生成事件数据。在这种情况下,类库中为无数据事件提供的事件委托 System.EventHandler 便足够了。其声明如下。 delegate void EventHandler(object sender, EventArgs e); 事件委托是多路广播的,这意味着它们可以对多个事件处理方法进行引用。有关详细信息,请参见 Delegate。委托考虑了事件处理中的灵活性和精确控制。通过维护事件的已注册事件处理程序列表,委托为引发事件的类担当事件发送器的角色。 有关使用委托在您的组件或控件中提供事件功能的详细信息,请参见引发事件。 有关在您的应用程序中使用事件的概述,请参见使用事件。 基于Windows的应用程序也是基于消息的。这说明,应用程序是通过Windows来通信的,Windows又是使用预定义的消息与应用程序通信的。这些消息是包含各种信息的结构,应用程序和Windows使用这些信息决定下一步的操作。在MFC等库或VB等开发环境推出之前,开发人员必须处理Windows发送给应用程序的消息。VB和今天的.NET把这些传送来的消息封装在事件中。如果需要响应某个消息,就应处理对应的事件。一个常见的例子是用户单击了窗体中的按钮后,Windows就会给按钮消息处理程序(有时称为Windows过程或WndProc)发送一个WM_MOUSECLICK消息。对于.NET开发人员来说,这就是按钮的OnClick事件。 楼下的,楼上的。帮忙解释下这两句的意思啊。 System.Threading.Thread.Sleep(1000); Application.DoEvents(); 不是很清楚呢,这两句。while (m_bPlay) { if (m_iTimeout >= 10) { // 事件到了,触发Timeout事件 if (TimeoutEven != null) { TimeoutEven(); } } System.Threading.Thread.Sleep(1000); Application.DoEvents(); m_iTimeout++; } //线程sleep,睡眠1秒钟System.Threading.Thread.Sleep(1000); //为了防止在循环中程序界面假死(因为正在执行循环代码而没有处理鼠标、键盘、界面重画等其他消息)//所以在循环中加入这句,执行它任务队列里面的事情Application.DoEvents(); 事件是一个委托类型事件定义在类里面事件用于和外界通信public delegate void MyDelegate(Object sender, string msg); // 自定义一个委托public class Class1{ public event MyDelegate OnStart; // 事件是一个委托类型 public void Start() { OnStart(this, "A Message"); // 引发事件 }}private void button1_Click(object sender, EventArgs e){ Class1 class1 = new Class1(); class1.OnStart += new MyDelegate(ShowMsg); // 方法和事件绑定 // Class1类执行这个方法,会引发OnStart事件,现实和外界通信 class1.Start();}public void ShowMsg(Object sender, string msg){ // 这是处理事件的方法,sender、msg 是OnStart事件发出的信息 MessageBox.Show(msg);} 这个System.Threading.Thread.Sleep(1000); 休眠1秒钟,是指当前正在运行的线程吧,跟主线程有什么关系? 形象的说,事件就是类或者对象用来发送通知的成员,即事件为类和类的实例提供里向外界发送通知的能力。通过提供事件的句柄,客户能够把事件和可执行代码联系在一起。事件机制有如下特征:1 事件既可以被声明成为类域成员,也可以被声明为属性。2 在.net框架中,事件是将事件发送者与事件接收者相关联的一种代理类,即事件机制是通过代理来实现的。3 一个事件发送者可以同时发出多个处理事件的方法。 自定义的事件也是基于消息处理的。这是它的本质。 所谓触发的时机也不过是在适当的时候发送的消息。 比如你在c#里用定时器,要触发一个事件。实质上是定时器是封装了setTimer这个api,它每隔一段inteval会发送一个WM_TIMER的消息。接收到这个消息之后,再去调setTimer的回调函数,即是你封装的TimeOutEvent 要自定义消息也是可以的。不过c#比较麻烦,我就不写怎么做了。 最后看了一下,ZengHD,觉得你写这个例子不太算事件。因为好像不是用真的定时器,而是模拟的,只是顺序执行一些函数而已,通过一些计数和sleep拖延了时间。我觉得不能算事件的。 如何判断dataSet中数据是否被修改... 打包时时,安装prerequisites选从当前项目的相同位置下载时出错 用Tcp协议实现C#网络通信 OPCAutomation问题? 如何将PictureBox控件的中心直接设定为画图的坐标原点(0,0) c#的问题?在线等 web server如何向windows server post 数据?类似httpHandlers 问个蠢问题,没有.net Framework能不能运行C#编写的程序 c#一个界面的设计应该怎么弄? 第一次提问,应该算是API的问题吧! 关于C#读取并分离文件的问题 SqlDataAdatper.Update问题
这些都是系统默认的事件,所以我们可以直接使用而不用管它什么时候触发。
自定义事件就需要手工触发事件,也就是说在什么时候通知其他类或者对象发生了这件事。说得好乱,文字不是强项,不说了,看楼下的
Button button1 = new Button(); // 产生一个事件处理的委托实例并添加到产生的事件列表中
button1.OnClick += new EventHandler( this.buttonClick );
//这里是真正处理事件的函数
private void buttonClick(object sender, KeyEventArgs e)
{
MessageBox.Show( "just click me");
}
如果直接用=会将默认的覆盖掉,所以一般用+=
其实就当是普通的+=就好了
int i = 1;
i += 2; //i = 1 + 2;
i = 2; // i = 2;
如果要添加标准的事件处理,都可以直接按照这样原型来写事件处理函数。比如前面写的
private void buttonClick(object sender, KeyEventArgs e)
{
MessageBox.Show( "just click me");
}当你做的是自定义事件时,根据你的需要要传递的参数可能跟这个原型有所出入,这时候就需要你自己定义一个委托了。
而你的事件处理函数也是依照你定义的委托来写。
.NET中的事件是基于委托的.
+=就是添加一个事件/委托处理程序,它是delegate类中重载的运算符.你理解为Add就好了
系统默认的事件,应该是基于消息处理的,但自定义的事件,就需要一个触发的时机,例如: // 定义超时委托
delegate void Timeout();
// 定义超时事件
event Timeout TimeoutEven; // 事件处理函数
private void EventFunction()
{
m_iTimeout = 0;
m_bPlay = false;
MessageBox.Show("时间到了");
} private int m_iTimeout = 0;
private bool m_bPlay = false;
private void button1_Click(object sender, EventArgs e)
{
// 关联事件处理函数
TimeoutEven += EventFunction;
m_bPlay = true; while (m_bPlay)
{
if (m_iTimeout >= 10)
{
// 事件到了,触发Timeout事件
if (TimeoutEven != null)
{
TimeoutEven();
}
} System.Threading.Thread.Sleep(1000);
Application.DoEvents();
m_iTimeout++;
}
}
自定义的事件也是基于消息处理的。这是它的本质。
所谓触发的时机也不过是在适当的时候发送的消息。比如你在c#里用定时器,要触发一个事件。实质上是定时器是封装了setTimer这个api,它每隔一段inteval会发送一个WM_TIMER的消息。接收到这个消息之后,再去调setTimer的回调函数,即是你封装的TimeOutEvent要自定义消息也是可以的。不过c#比较麻烦,我就不写怎么做了。最后看了一下,ZengHD,觉得你写这个例子不太算事件。因为好像不是用真的定时器,而是模拟的,只是顺序执行一些函数而已,通过一些计数和sleep拖延了时间。我觉得不能算事件的。
//使用Action<T>委托
class A{
//为本类定义一个事件
public event Action<string> SendMessage;
//按MSDN推荐,写了事件以后你需要写一个按一定模式它的触发如下;
protected virtual void OnSendMessage(string message)
{
if(this.SendMessage!=null)//X1 处
this.SendMessage.Invoke(message);
}
}
//下面我们将使用这个定义的事件"SendMessage",
//注意使用事件的条件是,存在一个类的引用(包含关系),被包含者的事件被使用所以..
class B{
//申明A的对象:
A a;
public B(){
this.a=new A();
//实例化a之后接着,"订阅"它的事件用 "+="符号
this.a.SendMessage+=this.ShowMessage;//+=号之后,可以直接写一个方法名这样更简单
}
void ShowMessage(string msg){
//你的在这里写你订阅事件的响应代码...
MessageBox.Show(msg);
}
}
//至此整个涉及事件的内容交待完毕,下面回过来讲一下,为什么说事件是一个特殊的委托
//它特殊在什么地方呢?个人认为是在这里;依然借用上面代码举例;
//...
//注意X1处,"this.SendMessage!=null",只有在定义事件的类的内部才可以设置事件
//是否为null除此之外的其它地方,只能存在+=,-=操作 //有关更多讯息请参考MSDN的帮助.
-------------------------------------------------
北京国展大型人才招聘会(9.27)
http://www.315job.com/YaoQingHan/20080927.html
{
if (m_iTimeout >= 10)
{
// 事件到了,触发Timeout事件
if (TimeoutEven != null)
{
TimeoutEven();
}
} System.Threading.Thread.Sleep(1000);
Application.DoEvents();
m_iTimeout++;
}
红星星高手,详细解释下这段代码的含义可以不,我只知道用,具体每句的含义不是太清楚。
如
System.Threading.Thread.Sleep(1000);
Application.DoEvents();
谢谢了
事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。 在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。 委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。下面的示例显示了事件委托声明。 C# 复制代码
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
该语法与方法声明的语法相似,但是 delegate 关键字通知编译器 AlarmEventHandler 是一个委托类型。按照约定,.NET Framework 中的事件委托有两个参数:引发事件的源和该事件的数据。 AlarmEventHandler 委托的实例可以绑定到任何一个与其签名匹配的方法上,例如下面的示例中显示的 WakeMeUp 类的 AlarmRang 方法。 public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e)
{...};
...
} 只有当事件生成事件数据时才需要自定义事件委托。许多事件,包括一些用户界面事件(例如鼠标单击)在内,都不生成事件数据。在这种情况下,类库中为无数据事件提供的事件委托 System.EventHandler 便足够了。其声明如下。 delegate void EventHandler(object sender, EventArgs e);
事件委托是多路广播的,这意味着它们可以对多个事件处理方法进行引用。有关详细信息,请参见 Delegate。委托考虑了事件处理中的灵活性和精确控制。通过维护事件的已注册事件处理程序列表,委托为引发事件的类担当事件发送器的角色。 有关使用委托在您的组件或控件中提供事件功能的详细信息,请参见引发事件。 有关在您的应用程序中使用事件的概述,请参见使用事件。
帮忙解释下这两句的意思啊。
System.Threading.Thread.Sleep(1000);
Application.DoEvents();
不是很清楚呢,这两句。
while (m_bPlay)
{
if (m_iTimeout >= 10)
{
// 事件到了,触发Timeout事件
if (TimeoutEven != null)
{
TimeoutEven();
}
}
System.Threading.Thread.Sleep(1000);
Application.DoEvents();
m_iTimeout++;
}
//线程sleep,睡眠1秒钟
System.Threading.Thread.Sleep(1000); //为了防止在循环中程序界面假死(因为正在执行循环代码而没有处理鼠标、键盘、界面重画等其他消息)
//所以在循环中加入这句,执行它任务队列里面的事情
Application.DoEvents();
事件定义在类里面
事件用于和外界通信
public delegate void MyDelegate(Object sender, string msg); // 自定义一个委托public class Class1
{
public event MyDelegate OnStart; // 事件是一个委托类型 public void Start()
{
OnStart(this, "A Message"); // 引发事件
}
}private void button1_Click(object sender, EventArgs e)
{
Class1 class1 = new Class1();
class1.OnStart += new MyDelegate(ShowMsg); // 方法和事件绑定 // Class1类执行这个方法,会引发OnStart事件,现实和外界通信
class1.Start();
}public void ShowMsg(Object sender, string msg)
{
// 这是处理事件的方法,sender、msg 是OnStart事件发出的信息 MessageBox.Show(msg);
}
这个System.Threading.Thread.Sleep(1000); 休眠1秒钟,是指当前正在运行的线程吧,跟主线程有什么关系?
事件机制有如下特征:
1 事件既可以被声明成为类域成员,也可以被声明为属性。
2 在.net框架中,事件是将事件发送者与事件接收者相关联的一种代理类,即事件机制是通过代理来实现的。
3 一个事件发送者可以同时发出多个处理事件的方法。
所谓触发的时机也不过是在适当的时候发送的消息。 比如你在c#里用定时器,要触发一个事件。实质上是定时器是封装了setTimer这个api,它每隔一段inteval会发送一个WM_TIMER的消息。接收到这个消息之后,再去调setTimer的回调函数,即是你封装的TimeOutEvent 要自定义消息也是可以的。不过c#比较麻烦,我就不写怎么做了。 最后看了一下,ZengHD,觉得你写这个例子不太算事件。因为好像不是用真的定时器,而是模拟的,只是顺序执行一些函数而已,通过一些计数和sleep拖延了时间。我觉得不能算事件的。