在C#编程中,事件是一种非常强大的机制,它允许对象在发生特定操作时通知其他对象。本文将通过一个简单的示例,介绍如何在C#中创建和使用事件。
本文的源代码来源于Visual Studio 2005。如果使用的是其他开发环境,需要将解决方案适配到环境。可以在网上查找相关信息。
对于程序员来说,代码是最重要的部分。下载它,查看它,如果对它不是100%确定,请回到这里。
首先,需要看到类,包含事件的类:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace learnEvents
{
public delegate void WorkerEndHandler(object o, WFEventArg e);
class WFEventArg : EventArgs
{
public readonly string TheString;
public WFEventArg(string s)
{
TheString = s;
}
}
class Worker
{
public readonly string Name;
public event WorkerEndHandler WorkEnd;
public Worker(string name)
{
Name = name;
}
public void Work(string s)
{
Thread.Sleep(2500);
WFEventArg e1 = new WFEventArg(s);
OnWorkEnd((object)this, e1);
}
void OnWorkEnd(object o, WFEventArg e)
{
if (WorkEnd != null)
WorkEnd(o, e);
}
}
}
在这里,创建了一个名为Worker的简单类,该类包含一个名为Work的过程,该过程有一个参数(一个字符串)。这个函数实际上什么也不做,只是休眠2.5秒,然后释放一个事件(告诉某人它完成了它的工作)。为此,需要一个委托- WorkerEndHandler - 和一个名为WFEventArg的类,该类继承自EventArgs类。事件是通过名为OnWorkEnd的方法释放的。
然后需要使用这个事件...好吧,创建了一个简单的表单,有两个按钮和一个标签,创建了两个Worker对象(wkr1,wkr2)。当点击第一个按钮时,第一个工人(wkr1)将工作,以此类推,第二个按钮。当表单加载时,告诉工人当他们完成工作时应该做什么 - 使用事件。工人的事件都在同一个方法中:wkr_WorkEnd。这个函数的参数与释放事件的OnWorkEnd方法的参数相同,可以根据需要自定义这些参数。最后,这个方法做了在该事件中想要做的事情:将标签文本字段设置为EventArg类,并告诉用户工人完成了他的工作。可以在该事件中做任何想做的事情,可以选择!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace learnEvents
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
#region Lesson
Worker wkr1 = new Worker("The 1'st worker");
Worker wkr2 = new Worker("The 2'nd worker");
private void button1_Click(object sender, EventArgs e)
{
wkr1.Work("AnAbAnAnA");
}
private void button2_Click(object sender, EventArgs e)
{
wkr2.Work("aNaBaNaNa");
}
private void Form1_Load(object sender, EventArgs e)
{
wkr1.WorkEnd += new WorkerEndHandler(wkr_WorkEnd);
wkr2.WorkEnd += new WorkerEndHandler(wkr_WorkEnd);
}
void wkr_WorkEnd(object o, WFEventArg e)
{
Worker worker = (Worker)o;
label1.Text = e.TheString;
MessageBox.Show(worker.Name + ":\tI've done my job!!!");
}
#endregion
}
}