事件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来尝试解决这个线程同步问题.首先 ...
随机推荐
- SSH通过SSH代理连接到内网机器
要解决的问题? 需要解决的问题:https://q.cnblogs.com/q/105319/ 简单来说就是本地机器通过一台公网机器SSH到公网机器后面的私网机器. 网络环境如下图:本地机器可访问代理 ...
- STM32基于固件库新建MDK工程模板(精简版)
上个博文理论讲解的东西太多,太复杂,这里把所有步骤全部贴出 1.新建一个工程文件夹LED 2.LED文件夹下建立如下文件夹 3.Project –>New Uvision Project 到US ...
- 使用Onenote & Evernote & VSC+Markdown构建个人笔记系统
Onenote & Evernote & VSC+Markdown构建个人笔记系统 umeowbing(转载请注明出处) 1 Why 笔记本太多,全部带着太重,查找起来也很麻烦-- 笔 ...
- TensorFlow之CNN:运用Batch Norm、Dropout和早停优化卷积神经网络
学卷积神经网络的理论的时候,我觉得自己看懂了,可是到了用代码来搭建一个卷积神经网络时,我发现自己有太多模糊的地方.这次还是基于MINIST数据集搭建一个卷积神经网络,首先给出一个基本的模型,然后再用B ...
- 前端利用百度开发文档给的web服务接口实现对某个区域周边配套的检索
最近项目需要实现地图功能,以便于实现对房源周边配套设施的检索.内容如下 其实百度官方有对应的api,但是对于一个网站来说这样的样式难免有些难看 这样的结果显然不能满足当下的需求,所以我决定利用官方给的 ...
- Android Gradle基于参数化配置实现差异化构建
一.背景: 项目中有一些特殊的需求,如个别渠道集成腾讯bugly,个别渠道集成易观统计,不同的渠道集成不同的推送策略(如Oppo渠道优先Opush推送),不同的渠道拥有不同的第三方登录集成等等.这些需 ...
- 带着新人看java虚拟机04(多线程篇)
我记得最开始接触多进程,多线程这一块的时候我不是怎么理解,为什么要有多线程啊?多线程到底是个什么鬼啊?我一个程序好好的就可以运行为什么要用到多线程啊?反正我是十分费解,即使过了很长时间我还是不是很懂, ...
- Java 泛型完全解读
对于泛型的使用我想大家都非常熟悉,但是对于类型擦除,边界拓展等细节问题,可能不是很清楚,所以本文会重点讲解一下:另外对泛型的了解其实可以看出,一个语言特性的产生逻辑,这对我们平时的开发也是非常有帮助的 ...
- JQuery --- 第一期 (初识jQuery, JQuery核心函数和工具方法)
个人学习笔记 初识jQuery 1.我的第一个JQuery <!DOCTYPE html> <html lang="en"> <head> & ...
- Angular(03)-- lint风格规范和WebStorm小技巧
在开始讲 Angular 各个核心知识点之前,想先来讲讲开发工具 WebStorm 的一些配置以及相应配置文件如 tslint.json 的配置. 因为我个人比较注重代码规范.代码风格,而对于这些规范 ...