winForm开发中线程间方法调用需要用委托,比如子线程不能直接调用主线程的方法。
解决方案 »
- C#读取.CSV文件的问题(急~!)
- 菜鸟问题 datatable
- server.createobject 服务器端创建控件失败,但用客户端创建是可以的
- 请问用.net2003开发好的网站在本机没有错误,上传到FTP后,结果总是出现提示错误:
- 在DataGrid里面添加显示按扭问题(显示不如意)
- 关于数据库的问题!!
- 一个跟输出参数 以OUT 修饰符声明 的方法
- web自定义控件,属性支持文件浏览
- 望大家给我点建议
- 多文档窗体的子窗体怎么样在一起就最大化。
- C#中ActiveX控件,InBody720 接口 这段代码求指点!
- 如何通过txxtBox_keypress在同一个textBox文本框获得两个不同的整型值
using System;
public class EventTest
{
// 步骤1,定义delegate对象
public delegate void MyEventHandler(object sender, System.EventArgs e);
// 步骤2省略
public class MyEventCls
{
// 步骤3,定义事件处理方法,它与delegate对象具有相同的参数和返回值类// 型
public void MyEventFunc(object sender, System.EventArgs e)
{
Console.WriteLine("My event is ok!");
}
}
// 步骤4,用event关键字定义事件对象
private event MyEventHandler myevent;
private MyEventCls myecls;
public EventTest()
{
myecls = new MyEventCls();
// 步骤5,用+=操作符将事件添加到队列中
this.myevent += new MyEventHandler(myecls.MyEventFunc);
}
// 步骤6,以调用delegate的方式写事件触发函数
protected void OnMyEvent(System.EventArgs e)
{
if(myevent != null)
myevent(this, e);
}
public void RaiseEvent()
{
EventArgs e = new EventArgs();
// 步骤7,触发事件
OnMyEvent(e);
}
public static void Main()
{
EventTest et = new EventTest();
Console.Write("Please input ''a'':");
string s = Console.ReadLine();
if(s == "a")
{
et.RaiseEvent();
}
else
{
Console.WriteLine("Error");
}
}
}
private event MyEventHandler myevent;
// 步骤5,用+=操作符将事件添加到队列中
this.myevent += new MyEventHandler(myecls.MyEventFunc);这就是事件的定义
if(myevent != null)
就触发了。
if(myevent != null)
就触发了。
想OnClick之类的是在点击后触发,但是在那段代码里,我看不出是在发生了什么之后触发的。求教~
if(myevent != null)
就触发了。
this.myevent += new MyEventHandler(myecls.MyEventFunc);
是注册事件
发生了 就触发事件
RaiseEvent()
if(myevent != null)
就触发了。
this.myevent += new MyEventHandler(myecls.MyEventFunc);
是注册事件
发生了 就触发事件
RaiseEvent()
不知道我这么理解对不对。
在执行了注册事件的代码
this.myevent += new MyEventHandler(myecls.MyEventFunc);
之后,myevent就不等于 null了。
所以在注册事件后,每次我执行
protected void OnMyEvent(System.EventArgs e)
{
if(myevent != null)
myevent(this, e);
}
这个方法的时候,就会执行myevent(this, e);
也就是说,当我通过+=进行事件注册后,对于myevent(this, e);就相当于和调用方法的操作一样了。所谓的我想要在发生什么事件(如点击)后进行,都是我在调用myevent(this, e);之前自己在代码中做操作。
也就是说,这个事件处理机制,只是提供了我一个异步操作的可能,剩下的基本和调用公共方法差不多。
是这样么?
if(myevent != null)
就触发了。
this.myevent += new MyEventHandler(myecls.MyEventFunc);
是注册事件
发生了 就触发事件
RaiseEvent()
不知道我这么理解对不对。
在执行了注册事件的代码
this.myevent += new MyEventHandler(myecls.MyEventFunc);
之后,myevent就不等于 null了。
所以在注册事件后,每次我执行
protected void OnMyEvent(System.EventArgs e)
{
if(myevent != null)
myevent(this, e);
}
这个方法的时候,就会执行myevent(this, e);
也就是说,当我通过+=进行事件注册后,对于myevent(this, e);就相当于和调用方法的操作一样了。所谓的我想要在发生什么事件(如点击)后进行,都是我在调用myevent(this, e);之前自己在代码中做操作。
也就是说,这个事件处理机制,只是提供了我一个异步操作的可能,剩下的基本和调用公共方法差不多。
是这样么?
可以这样理解比如:你某个地方西要用到 就this.myevent +=
用完记得 this.myevent -=
最后问下,用event关键字定义事件对象,但是不用event貌似功能也一样的,那event有什么用?
声明为事件的好处是,可以在程序各个位置添加相互独立的事件处理函数,不用担心被其它人给覆盖掉。我弄明白了,基础部分完全懂了,event就是多了+=和-=。
如果这样,方法能跨线程了变量可以跨线程么?我以前好像遇到线程间无法调用变量的。变量不存在跨线程一说,只是UI对象要在非UI线程里操作,需要委托给UI线程去处理,而变量在任何线程你都可以随意访问,这时你要做好同步,或者使用线程安全的对象
声明为事件的好处是,可以在程序各个位置添加相互独立的事件处理函数,不用担心被其它人给覆盖掉。我弄明白了,基础部分完全懂了,event就是多了+=和-=。
结贴后发现这个是错的,event是用来限制触发条件的。委托也可以绑定多个处理函数。
如果这样,方法能跨线程了变量可以跨线程么?我以前好像遇到线程间无法调用变量的。变量不存在跨线程一说,只是UI对象要在非UI线程里操作,需要委托给UI线程去处理,而变量在任何线程你都可以随意访问,这时你要做好同步,或者使用线程安全的对象
这样啊,学到一条,(*^__^*) 谢谢~