所以接收者必须提供的方法必须是一下形式:
void MethodName(Object sender,NewMailEventArgs e);
3. 定义负责引发事件的方法来通知事件的登记对象
public class MailManager{
// 定义事件成员
public event EventHandler<NewMailEventArgs> NewMail;
// 定义负责引发事件的方法来通知已登记的对象
protected virtual void OnNewMail(NewMailEventArgs e){
// 将字段复制到一个临时变量,避免多线程情况中这个成员被移除
EventHandler<NewMailEventArgs> temp=Volatile.Read(ref NewMail);
if(temp!=null) temp(this,e);
}
// 接受附加信息并调用引发事件的方法来通知所有登记的对象
public void SimulateNewMail(string from,string to,string subject){
NewMailEventArgs e=new NewMailEventArgs(from,to,subject);
OnNewMail(e);
}
}
4. 定义事件接收者
public class Fax{
public Fax(MailManager mm){
// 构造委托实例,向事件登记回调方法
mm.NewMail+=FaxMsg;
}
/// <summary>
/// 回调方法
/// </summary>
/// <param name="sender">表示MailManager对象,便于将信息传递给他</param>
/// <param name="e">表示MailManager对象想传给我们的附加信息</param>
private void FaxMsg(object sender,NewMailEventArgs e){
Console.WriteLine("msg:{0},{1},{2}",e.From,e.To,e.Subject);
}
/// <summary>
/// 注销对事件的登记
/// </summary>
/// <param name="mm"></param>
public void Unregister(MailManager mm){
mm.NewMail-=FaxMsg;
}
}
对象不在接收事件通知时应注销对事件的关注。因为对象只要向事件等急了它的一个方法,便不能被垃圾回收。
5. 程序初始化时应首先构造MailManager对象,将指向它的变量传递给Fax。在Fax构造器中添加对事件的关注。最后调用MailManager对象的事件通知方法
static void Main(string[] args)
{
MailManager mm=new MailManager();
Fax f=new Fax(mm);
mm.SimulateNewMail("a","b","Hello World!");
Console.ReadKey();
}
控制台输出结果:以调用回调方法。

以上就是详解C#之事件的详细内容,更多关于C#之事件的资料请关注易采站长站其它相关文章!










