zoukankan      html  css  js  c++  java
  • CLR via C#深解笔记五

    事件处理实际上是一种具有特殊签名的delegate, 像这个样子:public delegate void EventHandler(object sender, EventArgs e);
     
    类型定义事件成员,就可以通知其他对象发生了特定的事情。如果定义一个事件成员,意味着类型要提供一下能力:
    #1,方法可登记也可注销它对该事件的关注
    #2,该事件发生时,登记了的方法会收到通知。
     
    类型之所以能够提供事件通知功能,是因为类型维护了一个已经登记方法的列表。事件发生后,类型将通知列表中所有已登记的方法。
    CLR事件模型建立在委托的基础上。委托是调用(invoke)回调方法的一种类型安全的方式。对象凭借回调方法接收他们订阅的通知。
     
    ---------
    invoke和call
    在英语的语境中,invoke和call的区别在于,在执行一个所有信息都已知的方法时,用call比较恰当。这些信息包括要引用的类型、方法的签名以及方法名。
    但是,在需要先“唤出”某个东西来帮你调用一个信息不明的方法时,用invoke就比较恰当。
     
    ---------
     
     
    这个OnBoiled方法的问题在于,线程可能发现Boiled不为null, 然后,就在调用之前,另一个线程从委托链中移除一个委托,使Boiled变成了null,还会抛出一个NullReferenceException异常。为了修正这个竞态问题,可以像下面这样写OnBoiled方法
     
     
     
     
  • 相关阅读:
    Qt共享内存实现进程间通信(QSharedMemory)
    Qt5.5制作简单的屏幕截图程序
    006--C++动态内存(简介)
    005--C++字符
    004--C++11的初始化方式
    003--sizeof的使用
    002--C++程序的创建
    001--基础知识准备
    Qt5.5连接MySQL
    vue-cli中如何创建并引入自定义组件
  • 原文地址:https://www.cnblogs.com/Dlonghow/p/5126132.html
Copyright © 2011-2022 走看看