利用自定义的Event或者使用Action实现对象之间的通信
两个对象之间如果要进行通信,我们可以使用Event,或者是Action来解决,在实际的开发过程中,当需要在类A中调用类B中的一个异步执行的方法,然后又希望B中的方法执行完之后需要触发A类中的一些操作,这个时候我们就应该想到事件。
通常情况下,我们了解最多的是控件的事件,然后控件的事件的触发一般都是通过外界输入来触发的,譬如鼠标点击控件触发,键盘有按键时触发。事件触发后我们就可以在注册事件的EventHandle中处理和响应事件。其实,完全也可以自己定义事件,通过代码的形式来触发事件。
下面我通过下面的例子,介绍两种对象间通信的方法:例子非常简单
1、新建一个Windows应用程序,在Form1上面拖放连个控件,一个用来测试自定义的Event触发的事件,一个用Action测试的。
2、新建另一个和Form1.cs通信的类ActionEvent.cs;
先贴上代码:
Form1.cs:
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace EventTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ActionEvent demo = new ActionEvent();
//注册事件
demo.EventAction += delegate
{
MessageBox.Show("Ok");
};
}
private void button2_Click(object sender, EventArgs e)
{
ActionEvent demo = new ActionEvent();
Action sysAction = delegate { MessageBox.Show("Ok"); };
demo.SystemAction = sysAction;//公用一个事件委托
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace EventTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ActionEvent demo = new ActionEvent();
//注册事件
demo.EventAction += delegate
{
MessageBox.Show("Ok");
};
}
private void button2_Click(object sender, EventArgs e)
{
ActionEvent demo = new ActionEvent();
Action sysAction = delegate { MessageBox.Show("Ok"); };
demo.SystemAction = sysAction;//公用一个事件委托
}
}
}
EventAction.cs
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventTest
{
class ActionEvent
{
public delegate void MyAction();
public event MyAction EventAction;
public Action SystemAction { get; set; }
public ActionEvent()
{
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Start));
thread.Start();
}
void Start()
{
System.Threading.Thread.Sleep(3000);
if (EventAction != null)
EventAction();//触发事件
if (SystemAction != null)
SystemAction();//触发事件
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventTest
{
class ActionEvent
{
public delegate void MyAction();
public event MyAction EventAction;
public Action SystemAction { get; set; }
public ActionEvent()
{
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Start));
thread.Start();
}
void Start()
{
System.Threading.Thread.Sleep(3000);
if (EventAction != null)
EventAction();//触发事件
if (SystemAction != null)
SystemAction();//触发事件
}
}
}
这个例子想说明的实际就是:
当使用Event时候,当ActionEvent类中的事件触发的时候,它将会使得所有注册过它的类中的委托或方法响应它;
当时用Action时,其实是两个类公用了一个委托的引用,当其中一个引用触发时候,另一个当然也就同时被激发了。
很简单的Demo,然后其实在项目中异步编程的时候经常可以排上用场的:)