其实,我至今为止还不清楚delegate的用法,反正在线程间或进程间的数据交互大多需要此关键字来实施,我在上一篇博文用了C#函数指针的方法进行参数的跨线程传递,现在则采用更为常规的办法——消息响应。说实话,C#下面的消息响应方式还真不好理解,远没有C++下的映射好理解。
创新互联公司是网站建设技术企业,为成都企业提供专业的成都网站建设、成都做网站,网站设计,网站制作,网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制适合企业的网站。10余年品质,值得信赖!事实上,我们可以通过双击窗体,在工程自动添加的消息响应函数来观察一下,如下所示:
this.Load += new System.EventHandler(this.Form1_Load);像这个“+=”的符号就是一个挺费解的东西,上面的似乎可以这个么理解,将Form1_Load的响应函数添加到Load类型的消息队列里,通过delegate应该会将每个响应函数配置一个唯一的标识符,然后才可以达到类似映射的效果。
以下是我封装的一个事件类,若需要事件响应的类都可以在此基础上继承:
////// 定义消息的类型 /// /// 接收器 /// 参数 public delegate void MyEventHandler(object sender, EventArgs e); ////// 通用事件类 /// public class MyEvent { ////// 定义事件队列 /// private event MyEventHandler _myEvent; ////// 基本构造函数 /// public MyEvent(MyEventHandler hEventFunc) { this._myEvent += new MyEventHandler(hEventFunc); } ////// 事件的触发函数 /// /// protected void OnEvent(EventArgs e) { this._myEvent(this, e); } ////// 触发事件 /// public void RaiseEvent() { EventArgs e = new EventArgs(); this.OnEvent(e); } }
使用时,如下所示:
//使用一个WinForm的应用程序 public partial class Form1 : Form { //事件类 private MyEvent et; public Form1() { InitializeComponent(); //将本类的消息响应函数传递至事件类et中 this.et = new MyEvent(this.OnTest); //触发事件响应 et.RaiseEvent(); } ////// 消息响应函数 /// /// /// public void OnTest(object sender, EventArgs e) { //随便写写 Debug.WriteLine(e.ToString()); } }
于是,当在某种情况下(自定义),使MyEvent类触发了消息,于是通过event调用了Form1类的OnTest函数,这就算完成了完整的一个消息响应了。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。