C#事件发布者订阅者释放,强引用
来源:互联网 发布:手机淘宝不能付款 编辑:程序博客网 时间:2024/05/16 16:57
事件的订阅者和发布者之间一旦添加订阅关系,他们之间即存在强引用,如下例所示,事件的订阅者即使被释放掉,发布者发布消息是事件的订阅者还能做出响应。因此当事件的发布者生命周期比事件的订阅者长时,订阅者的引用还一直存在发布者中,导致内存泄漏或者不应该出现调用的情况下产生了调用。对此应该十分注意。
using System;
using System.Collections.Generic;using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WeakEvents
{
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
publisher.MyEvent += subscriber.EventHandlers;
//订阅者订阅事件,正常输出
publisher.OnMyEvent();
subscriber = null;
Console.WriteLine("订阅者释放:");
//订阅者被释放,仍能正常输出
publisher.OnMyEvent();
publisher = null;
Console.WriteLine("发布者释放:");
//发布者被释放,不能正常输出。?可空调用,不加则空引用错误
publisher?.OnMyEvent();
Console.ReadKey();
}
}
class Publisher
{
public event EventHandler<EventArgs> MyEvent;
public void OnMyEvent()
{
if (MyEvent != null)
{
MyEvent(this,new EventArgs());
}
}
}
class Subscriber
{
public void EventHandlers(object sender, EventArgs e)
{
Console.WriteLine("我能输出!");
Console.WriteLine();
}
}
}
阅读全文
0 0
- C#事件发布者订阅者释放,强引用
- 从发布者和订阅者来看事件
- 发布者订阅者模式
- 发布者&订阅者模型
- Step into Redis- 07 - 发布者-订阅者
- 发布者订阅者模式(一)
- 简单的订阅者/发布者模式
- javascript 观察者模式 (订阅者与发布者)
- 简单的发布者/订阅者(Python)
- (十一)ROS发布者和订阅者
- 一个订阅发布者模式
- 订阅/发布者模式---JavaScript
- dojo发布者订阅者(dojo/topic模块)
- Qt C++ Observer模式(发布者-订阅者)
- ZeroMQ之模式二 发布者订阅者(publish-subscribe)
- Redis: Jedis 源代码剖析2- 发布者/订阅者模式剖析
- ROS学习之 cpp消息发布者和消息订阅者
- spring整合activeMQ-摘要(订阅者和发布者)
- 灰のNOIP总结
- 查看开机时间&查看进程启动时间
- 2.Java定义二叉树、二叉搜索树和Huffman树
- 汇编语言-偏移地址综合应用-双重循环实现
- (转)Java核心技术点之动态代理
- C#事件发布者订阅者释放,强引用
- java中length,length(),size()区别
- iframe异步加载技术及性能
- ACE,C++的框架
- python之正则表达式
- 实验1 顺序表的建立和运算
- servlet07-反射基础一
- 2个字符连接起来。用string方法
- ss