其实,我至今为止还不清楚delegate的用法,反正在线程间或进程间的数据交互大多需要此关键字来实施,我在上一篇博文用了C#函数指针的方法进行参数的跨线程传递,现在则采用更为常规的办法——消息响应。说实话,C#下面的消息响应方式还真不好理解,远没有C++下的映射好理解。
事实上,我们可以通过双击窗体,在工程自动添加的消息响应函数来观察一下,如下所示:
this.Load += new System.EventHandler(this.Form1_Load);像这个“+=”的符号就是一个挺费解的东西,上面的似乎可以这个么理解,将Form1_Load的响应函数添加到Load类型的消息队列里,通过delegate应该会将每个响应函数配置一个唯一的标识符,然后才可以达到类似映射的效果。
以下是我封装的一个事件类,若需要事件响应的类都可以在此基础上继承:
/// <summary>
/// 定义消息的类型
/// </summary>
/// <param name="sender">接收器</param>
/// <param name="e">参数</param>
public delegate void MyEventHandler(object sender, EventArgs e);
/// <summary>
/// 通用事件类
/// </summary>
public class MyEvent
{
/// <summary>
/// 定义事件队列
/// </summary>
private event MyEventHandler _myEvent;
/// <summary>
/// 基本构造函数
/// </summary>
public MyEvent(MyEventHandler hEventFunc)
{
this._myEvent += new MyEventHandler(hEventFunc);
}
/// <summary>
/// 事件的触发函数
/// </summary>
/// <param name="e"></param>
protected void OnEvent(EventArgs e)
{
this._myEvent(this, e);
}
/// <summary>
/// 触发事件
/// </summary>
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();
}
/// <summary>
/// 消息响应函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void OnTest(object sender, EventArgs e)
{
//随便写写
Debug.WriteLine(e.ToString());
}
}
于是,当在某种情况下(自定义),使MyEvent类触发了消息,于是通过event调用了Form1类的OnTest函数,这就算完成了完整的一个消息响应了。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。