事件(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一的更多相关文章

  1. 事件EVENT与waitforsingleobject的使用

    事件event与waitforsingleobject的配合使用,能够解决很多同步问题,也可以在数据达到某个状态时启动另一个线程的执行,如报警. event的几个函数: 1.CreateEvent和O ...

  2. 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  3. C#事件(event)解析

    事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...

  4. 【温故知新】c#事件event

    从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...

  5. 事件[event]_C#

    事件(event): 1.       事件是类在发生其关注的事情时用来提供通知的方式.例如,封装用户界面控件的类可以定义一个在单击该控件时发生的事件.控件类不关心单击按钮时发生了什么,但它需要告知派 ...

  6. C#中的委托(Delegate)和事件(Event)

    原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...

  7. MFC线程(三):线程同步事件(event)与互斥(mutex)

    前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...

  8. 重温委托(delegate)和事件(event)

    1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...

  9. C#总结(二)事件Event 介绍总结

    最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西.前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event). 事件(event),对于 ...

  10. 多线程面试题系列(6):经典线程同步 事件Event

    上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...

随机推荐

  1. 在weblogic上部署遇到的问题总结

    最近在weblogic上发布自己的项目,但是当调用程序服务时却报错了.于是查看了错误日志. 错误日志如下: Root cause of ServletException. java.lang.Link ...

  2. mySql入门-(一)

    学了很多乱七杂八的东西,但是依然停留在前端,在工作中一直和后端交流,但是不太了解数据库是怎么回事,为了加强学习,准备学习一些关于数据库相关的东西. 说起数据库可能会有很多很多,SQLServer.Or ...

  3. UML用法及状态图,活动图介绍

    统一建模语言UML(Unified Modeling Language)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制 ...

  4. Eclipse Debug调试遇到的问题

    在使用Debug模式前,一定要先打好断点.快捷调试方法:   在使用过程中,可以只保留Console,Variables,Debug窗口,把其他无用的窗口最小化掉,或者删掉即可.如果要恢复删掉的试图, ...

  5. 强化学习(十三) 策略梯度(Policy Gradient)

    在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习.这种Value Based强化学习方法在很多领域都得到比较好的应用,但是Value Based强化学习方法也有很 ...

  6. Docker进阶之六:网络管理

    一.默认网络 安装Docker时会自动创建三个网络:docker network ls 列出网络: # docker network ls NETWORK ID NAME DRIVER SCOPE 5 ...

  7. 实验二 request、out对象使用

    request.out对象使用 一.实验目的 1.掌握代码片段中的注释的应用: 2.掌握JSP脚本标示---Java代码片段的应用. 二.实验内容 1.设计教师与学生不同登陆界面,如下图: 2.验证码 ...

  8. 解决Dynamics 365使用JS调用Web API时报no property value was found in the payload 错误。

    摘要: 微软动态CRM专家罗勇 ,回复323或者20190421可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 碰到如下报错: message: "An er ...

  9. SAP HUM 锁住一个HU?

    SAP HUM 锁住一个HU? 1)SAP HUM 不能锁一个已发货的HU! 如下的HU 180141205000已经发货过账, HUMO, 执行, 2)一个WHSE状态的HU就可以被锁定.比如HU ...

  10. 6.使用桌面版AI伴侣或手机版AI伴侣实时预览编程效果

    1.根据自己系统下载对应版本AI伴侣,最好解压到D盘根目录. 运行ailaunch.bat ,可以启动原本自带的2.46版AI伴侣.运行AI伴侣247.bat可以启动汉化2.47版的AI伴侣.并且默认 ...