事件Event一
程序员文章站
2022-03-04 13:27:21
事件(Event)例如:最近的视觉中国‘黑洞事件’。我们大多数人(订阅者)是通过XX平台(发布者)得知的这一消息,然后订阅者A出售视觉中国的股票(触发的方法),订阅者B买入视觉中国的股票。 运行结果: ......
事件(event)例如:最近的视觉中国‘黑洞事件’。我们大多数人(订阅者)是通过xx平台(发布者)得知的这一消息,然后订阅者a出售视觉中国的股票(触发的方法),订阅者b买入视觉中国的股票。
1 using system; 2 using system.collections.generic; 3 using system.linq; 4 using system.text; 5 using system.threading; 6 7 namespace consoleevent 8 { 9 class program 10 { 11 static void main(string[] args) 12 { 13 //实例化一个事件对象 14 media eventsource = new media("视觉中国:黑洞也是我们家的!"); 15 16 //实例化关注事件的对象(订阅者) 17 stupiderone obj1 = new stupiderone(); 18 stupidertwo obj2 = new stupidertwo(); 19 20 //使用委托把对象及其方法注册到事件中 21 eventsource.blackholeevent += new blackholeeventhandle(obj1.sendstock); 22 eventsource.blackholeevent += new blackholeeventhandle(obj2.buystock); 23 24 //事件到了触发黑洞事件,事件的调用 25 eventsource.timeup(); 26 console.read(); 27 } 28 } 29 30 //第一步:定义一个类型用来保存所有需要发送给事件接收者的附加信息 31 public class blackholeeventargs : eventargs 32 { 33 //表示事件的内容 34 private readonly string content; 35 36 public string content 37 { 38 get { return content; } 39 } 40 41 public blackholeeventargs(string content) 42 { 43 this.content = content; 44 } 45 } 46 47 //第二步:定义一个黑洞事件,首先需要定义一个委托类型,用于指定事件触发时调用的方法类型 48 public delegate void blackholeeventhandle(object sender, blackholeeventargs e); 49 //定义事件成员 50 public class subject 51 { 52 //定义黑洞事件 53 public event blackholeeventhandle blackholeevent; 54 55 //第三步:定义一个负责引发事件的方法,它通知已关注的对象 56 protected virtual void notify(blackholeeventargs e) 57 { 58 //出于线程安全的考虑,现在将对委托字段的引用复制到一个临时字段中 59 blackholeeventhandle temp = interlocked.compareexchange(ref blackholeevent, null, null); 60 if (temp != null) 61 { 62 //触发事件,与方法的使用方式相同 63 //事件通知委托对象,委托对象调用封装的方法 64 temp(this,e); 65 } 66 } 67 } 68 69 //定义触发事件的对象,事件源 70 public class media : subject 71 { 72 private string content; 73 public media(string content) 74 { 75 this.content = content; 76 } 77 public void timeup() 78 { 79 blackholeeventargs eventarg = new blackholeeventargs(content); 80 //黑洞门来了,通知吃瓜们 81 this.notify(eventarg); 82 } 83 } 84 85 //吃瓜对象 86 public class stupiderone 87 { 88 public void sendstock(object sender, blackholeeventargs e) 89 { 90 console.writeline(e.content + "呵呵,我要抓紧出售视觉中国的股票"); 91 } 92 } 93 94 //吃瓜对象 95 public class stupidertwo 96 { 97 public void buystock(object sender, blackholeeventargs e) 98 { 99 console.writeline(e.content + "嘿嘿,我要等视觉中国的股票跌到底后,买入它的股票"); 100 } 101 } 102 }
运行结果:
上一篇: B/S FastReprot使用
下一篇: 实现一个简单的基于Token的身份认证
推荐阅读
-
背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作
-
一个可复用的vue分页组件
-
方便代理下单的EcStore收货地址一键分析插件,同时支持淘宝/京东/一号店,ecstore
-
上传图片回调出错,同一个回调函数,只是换了不同的域名,线上服务器可以,测试服务器报错,返回 579 错误怎么回事?
-
背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignm
-
上古神兵什么手机能玩 适配手机型号一览表
-
MAC--NPAPI学习(一)简要介绍NPAPI的函数
-
PHP 文件编程(一)-获取文件信息的二种方式
-
将数组扁平化并去除其中重复数据,最终得到一个升序且不重复的数组
-
详解node.js创建一个web服务器(Server)的详细步骤