事件Event一
事件(Event)例如:最近的视觉中国‘黑洞事件’。我们大多数人(订阅者)是通过XX平台(发布者)得知的这一消息,然后订阅者A出售视觉中国的股票(触发的方法),订阅者B买入视觉中国的股票。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace ConsoleEvent
{
class Program
{
static void Main(string[] args)
{
//实例化一个事件对象
Media eventSource = new Media("视觉中国:黑洞也是我们家的!"); //实例化关注事件的对象(订阅者)
StupiderOne obj1 = new StupiderOne();
StupiderTwo obj2 = new StupiderTwo(); //使用委托把对象及其方法注册到事件中
eventSource.BlackHoleEvent += new BlackHoleEventHandle(obj1.SendStock);
eventSource.BlackHoleEvent += new BlackHoleEventHandle(obj2.BuyStock); //事件到了触发黑洞事件,事件的调用
eventSource.TimeUp();
Console.Read();
}
} //第一步:定义一个类型用来保存所有需要发送给事件接收者的附加信息
public class BlackHoleEventArgs : EventArgs
{
//表示事件的内容
private readonly string content; public string Content
{
get { return content; }
} public BlackHoleEventArgs(string content)
{
this.content = content;
}
} //第二步:定义一个黑洞事件,首先需要定义一个委托类型,用于指定事件触发时调用的方法类型
public delegate void BlackHoleEventHandle(object sender, BlackHoleEventArgs e);
//定义事件成员
public class Subject
{
//定义黑洞事件
public event BlackHoleEventHandle BlackHoleEvent; //第三步:定义一个负责引发事件的方法,它通知已关注的对象
protected virtual void Notify(BlackHoleEventArgs e)
{
//出于线程安全的考虑,现在将对委托字段的引用复制到一个临时字段中
BlackHoleEventHandle temp = Interlocked.CompareExchange(ref BlackHoleEvent, null, null);
if (temp != null)
{
//触发事件,与方法的使用方式相同
//事件通知委托对象,委托对象调用封装的方法
temp(this,e);
}
}
} //定义触发事件的对象,事件源
public class Media : Subject
{
private string content;
public Media(string content)
{
this.content = content;
}
public void TimeUp()
{
BlackHoleEventArgs eventarg = new BlackHoleEventArgs(content);
//黑洞门来了,通知吃瓜们
this.Notify(eventarg);
}
} //吃瓜对象
public class StupiderOne
{
public void SendStock(object sender, BlackHoleEventArgs e)
{
Console.WriteLine(e.Content + "呵呵,我要抓紧出售视觉中国的股票");
}
} //吃瓜对象
public class StupiderTwo
{
public void BuyStock(object sender, BlackHoleEventArgs e)
{
Console.WriteLine(e.Content + "嘿嘿,我要等视觉中国的股票跌到底后,买入它的股票");
}
}
}
运行结果:

事件Event一的更多相关文章
- 事件EVENT与waitforsingleobject的使用
事件event与waitforsingleobject的配合使用,能够解决很多同步问题,也可以在数据达到某个状态时启动另一个线程的执行,如报警. event的几个函数: 1.CreateEvent和O ...
- 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- C#事件(event)解析
事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...
- 【温故知新】c#事件event
从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...
- 事件[event]_C#
事件(event): 1. 事件是类在发生其关注的事情时用来提供通知的方式.例如,封装用户界面控件的类可以定义一个在单击该控件时发生的事件.控件类不关心单击按钮时发生了什么,但它需要告知派 ...
- C#中的委托(Delegate)和事件(Event)
原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...
- MFC线程(三):线程同步事件(event)与互斥(mutex)
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...
- 重温委托(delegate)和事件(event)
1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...
- C#总结(二)事件Event 介绍总结
最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西.前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event). 事件(event),对于 ...
- 多线程面试题系列(6):经典线程同步 事件Event
上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...
随机推荐
- 使用 NLog 给 Asp.Net Core 做请求监控
为了减少由于单个请求挂掉而拖垮整站的情况发生,给所有请求做统计是一个不错的解决方法,通过观察哪些请求的耗时比较长,我们就可以找到对应的接口.代码.数据表,做有针对性的优化可以提高效率.在 asp.ne ...
- Arrays.asList 为什么不能 add 或者 remove 而 ArrayList 可以
分析如下例子: 1 import java.util.Arrays; 2 import java.util.List; 3 4 5 public class Test { 6 public stati ...
- 【毕业原版】-《巴斯大学毕业证书》Bath一模一样原件
☞巴斯大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&am ...
- istio添加Fluentd
这个教程展示了istio如何自定义日志格式,并且将其发送给fluent.Fluentd 是一个开源的日志收集器,支持多种数据输出并且有一个可插拔架构.Elasticsearch是一个流行的后端日志记录 ...
- J2EE相关概念,EJB/JNDI/JMS/RMI等
J2EE 四层模型 J2EE的核心API.组件.相关概念 JDBC(Java Database Connectivity) JNDI(Java Name and Directory Interface ...
- 哎呀,我老大写Bug啦——记一次MessageQueue的优化
MessageQueue,顾名思义消息队列,在系统开发中也是用的比较多的一个中间件吧.我们这里主要用它来做日志管理和订单管理的,记得老老大(恩,是的,就是老老大,因为他已经跳槽了)还在的时候,当时也是 ...
- React 中阻止事件冒泡的问题
在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...
- 使用Keepalived构建LVS高可用集群
LVS的DR模型配置+Keepalive部署 介绍 下图为DR模型的通信过程,图中的IP不要被扑结构中的IP迷惑,图里只是为了说明DR的通信原理,应用到本例中的拓扑上其工作原理不变. 拓扑结构 服务器 ...
- react-native 金币彩带雨下落动画
日常项目中,经常遇到一些表情雨/金币雨/彩带雨 等下落的动画,之前做android原生的时候,写过类似的效果,主要通过自定义view 在onDraw里绘制下落的过程,具体可以看下我的这篇github地 ...
- Android组件化探索与实践
什么是组件化 不用去纠结组件和模块语义上的区别,如果模块间不存在强依赖且模块间可以任意组合,我们就说这些模块是组件化的. 组件化的好处 实现组件化本身就是一个解耦的过程,同时也在不断对你的项目代码进行 ...