1、事件对象
/// <summary>
/// 事件对象
/// </summary>
class EventObj
{
public object obj; // 哪一个对象
public string funcName; // 方法名字
public MethodInfo method; // 方法对象
}
2、某个对象
就是任意举一个例子对象,你可以写任何的对象。
class Person
{
public string name;
public int age;
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
/// <summary>
/// Show方法
/// </summary>
/// <param name="msg"></param>
public void Show(string msg)
{
Console.WriteLine("名称为{0} 年龄为{1} {2}", this.name, this.age, msg);
}
}
3、事件的派发
class Program
{
// 创建一个事件队列
static Queue<EventObj> q = new Queue<EventObj>();
static void Main(string[] args)
{
// 创建两个具体的对象
Person p = new Person("xiaoming", 12);
Person p2 = new Person("abc", 123);
// 事件1
EventObj e0 = new EventObj();
e0.funcName = "Show";
e0.obj = p;
e0.method = e0.obj.GetType().GetMethod(e0.funcName);
q.Enqueue(e0); //入队
// 事件2
EventObj e1 = new EventObj();
e1.funcName = "Show";
e1.obj = p2;
e1.method = e0.obj.GetType().GetMethod(e1.funcName);
q.Enqueue(e1); //入队
//开启线程监听事件队列
Thread thread = new Thread(new ThreadStart(Process));
thread.Start(); //启动线程
}
/// <summary>
/// 线程处理函数
/// </summary>
static void Process()
{
while(true) //死循环,一直在监听队列中有没有新事件的到来
{
if(q.Count>0) //拿出事件
{
EventObj eventObj = q.Dequeue();
eventObj.method.Invoke(eventObj.obj, new object[] { "hello" });
}
}
}
}
事件的注册以及派发,多用于接收网络消息,向UI抛出事件,或者两个不同的UI,互相派发事件。事件的用途,主要是因为响应者的不确定性,才会想到用事件。事件的派发者,只管向外抛事件,而谁想要响应,就需要自己监听就可以了。