一、事件的感性认识:
成都网络公司-成都网站建设公司成都创新互联十年经验成就非凡,专业从事成都网站建设、成都网站设计,成都网页设计,成都网页制作,软文营销,广告投放等。十年来已成功提供全面的成都网站建设方案,打造行业特色的成都网站建设案例,建站热线:028-86922220,我们期待您的来电!现实生活中的“事件”无所不在,时刻都在发生,软件层面上的常见事件无非是鼠标事件、键盘事件、操作系统自己发出的事件。
事件的发送方称作为发布者(sender),接收事件的一方称作订阅者(receiver),一个事件可以有多个订阅者。 一个订阅者可处理来自多个发布者的多个事件。典型的多对多关系。
发布者和订阅者互相都不了解,只是通过Delegate委托来在之间交互,委托在这里起到了“媒人”作用。同时.net的事件机制很容易实现设计模式的观察者模式。
二、事件的不严格定义:
1) 事件是特殊类型的多路广播委托
2) 向其他类或对象提供通知的一种方式。
三、例子:
MSDN上有几个例子,我综合了下,作为编写事件的模板吧
1:
2: using System;
3: using System.Collections.Generic;
4: using System.Linq;
5: using System.Text;
6:
7: namespace CSharp.Event
8: {
9: public delegate void MyEventHandler(string s);
10:
11: public interface IPublisher
12: {
13: // 接口可声明事件。
14: event EventHandlerRaiseCustomEvent;
15: //自定义事件访问器,可选
16: event MyEventHandler OnMyEvent;
17: }
18:
19: ///
20: /// 自定义EventArgs类,用来保存事件信息
21: ///
22: public class CustomEventArgs : EventArgs
23: {
24: private string message;
25:
26: public string Message
27: {
28: get { return message; }
29: set { message = value; }
30: }
31:
32: public CustomEventArgs(string s)
33: {
34: message = s;
35: }
36:
37: }
38:
39: ///
40: /// 发布者
41: ///
42: class Publisher : IPublisher
43: {
44: object objectLock = new Object();
45: //使用EventHandler声明事件
46: public event EventHandlerRaiseCustomEvent;
47: private event MyEventHandler _myEventHandler;
48:
49: ///
50: /// 在大多数情况下都不需要提供自定义的事件访问器。
51: /// 如果您在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。
52: ///
53: public event MyEventHandler OnMyEvent
54: {
55: add
56: {
57: lock (objectLock)
58: {
59: _myEventHandler += value;
60: }
61: }
62: remove
63: {
64: lock (objectLock)
65: {
66: _myEventHandler -= value;
67: }
68: }
69: }
70:
71: public void DoSomething()
72: {
73: //省略。。。
74:
75: //自己引发事件
76: OnRaiseCustomEvent(new CustomEventArgs("Did something"));
77: //省略。。。
78:
79: if (_myEventHandler != null)
80: {
81:
82: _myEventHandler("你轻轻的走,不带走一片云彩!");
83: }
84:
85: }
86:
87: ///
88: /// 公开protected virtual方法,允许继承类重写事件调用行为
89: ///
90: ///
91: protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
92: {
93: EventHandlerhandler = RaiseCustomEvent;
94:
95: //如果没有订阅者,事件为空
96: if (handler != null)
97: {
98: e.Message += String.Format(" at {0}", DateTime.Now.ToString());
99:
100: //触发事件
101: handler(this, e);
102: }
103: }
104:
105:
106: }
107:
108: ///
109: /// 订阅者
110: ///
111: class Subscriber
112: {
113: private string id;
114: public Subscriber(string ID, Publisher pub)
115: {
116: id = ID;
117: //多路广播委托实现事件订阅
118: pub.RaiseCustomEvent += HandleCustomEvent;
119: pub.OnMyEvent += new MyEventHandler(pub_OnMyEvent);
120: }
121:
122: void pub_OnMyEvent(string s)
123: {
124: Console.WriteLine(string.Format("{0} 的开场白:{1}", id, s));
125: }
126:
127: ///
128: /// 当订阅者接收到事件,该做什么反应
129: /// 也就是常说的事件处理逻辑
130: ///
131: ///
132: ///
133: void HandleCustomEvent(object sender, CustomEventArgs e)
134: {
135: Console.WriteLine(id + " received this message: {0}", e.Message);
136: }
137: }
138:
139: class Program
140: {
141: static void Main(string[] args)
142: {
143: //实例一个发布者
144: Publisher pub = new Publisher();
145: //实例两个订阅者sub1,sub2,他们计划收听pub
146: Subscriber sub1 = new Subscriber("sub1", pub);
147: Subscriber sub2 = new Subscriber("sub2", pub);
148:
149: //发布者通过DoSomething触发事件,开始发布信息
150: pub.DoSomething();
151:
152: Console.WriteLine("Press Enter to close this window.");
153: Console.ReadLine();
154: }
155: }
156: }
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。