有的时候,我们会使用到WeakList,它和传统的List不同的是,保存的是对象的弱应用,在WeakList中存储的对象会被GC回收,在一些和UI相关的编程的地方会用到它(弱事件,窗体的通知订阅等)。

.Net本身并没有提供WeakList,今天编程的时候用到了,便随手写了一个,支持添加、删除和遍历。当对象被GC的时候也会自动从WeakList中删除。由于是一个即时兴起的一个程序,没有经过什么测试, 发现有Bug的话再更新一下。这里记录一下,以备后续查询使用。

  1. class WeakList<T> : IEnumerable<T> where T : class
  2. {
  3. Dictionary<long, WeakReference<T>> _dic = new Dictionary<long, WeakReference<T>>();
  4. ConditionalWeakTable<T, DisposeAction> _disposeActions = new ConditionalWeakTable<T, DisposeAction>();
  5.  
  6. public int Count { get { return _dic.Count; } }
  7.  
  8. [MethodImpl]
  9. public void Add(T item)
  10. {
  11. var id = getObjectId(item);
  12.  
  13. _dic.Add(id, new WeakReference<T>(item));
  14. _disposeActions.Add(item, new DisposeAction(() => removeObsolete(id)));
  15. }
  16.  
  17. [MethodImpl]
  18. public void Remove(T item)
  19. {
  20. var id = getObjectId(item);
  21.  
  22. _dic.Remove(id);
  23. _disposeActions.Remove(item);
  24. }
  25.  
  26. [MethodImpl]
  27. void removeObsolete(long id)
  28. {
  29. _dic.Remove(id);
  30. }
  31.  
  32. long getObjectId(T item)
  33. {
  34. return RuntimeHelpers.GetHashCode(item);
  35. }
  36.  
  37. IEnumerable<T> getDataSource()
  38. {
  39. foreach (var refer in _dic.Values)
  40. {
  41. T data = null;
  42.  
  43. if (!refer.TryGetTarget(out data))
  44. continue;
  45. else
  46. yield return data;
  47. }
  48. }
  49.  
  50. public IEnumerator<T> GetEnumerator()
  51. {
  52. return getDataSource().GetEnumerator();
  53. }
  54.  
  55. IEnumerator IEnumerable.GetEnumerator()
  56. {
  57. return getDataSource().GetEnumerator();
  58. }
  59.  
  60. class DisposeAction
  61. {
  62. Action _action;
  63. public DisposeAction(Action action)
  64. {
  65. _action = action;
  66. }
  67.  
  68. ~DisposeAction()
  69. {
  70. _action();
  71. }
  72. }
  73. }

一个简单的WeakList的实现的更多相关文章

  1. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  2. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  3. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  4. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  5. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  6. CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能

    CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能 效果图 这是红宝书里的例子,在这个例子中,下述功能全部登场,因此这个例子可作为使用Compute Shader的典型 ...

  7. CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator

    CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ...

  8. 应用OpenMP的一个简单的设计模式

    小喵的唠叨话:最近很久没写博客了,一是因为之前写的LSoftmax后馈一直没有成功,所以在等作者的源码.二是最近没什么想写的东西.前两天,在预处理图片的时候,发现处理200w张图片,跑了一晚上也才处理 ...

  9. 用php实现一个简单的链式操作

    最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen( ...

随机推荐

  1. Linux下部署weblogic应用

    1.Linux下weblogic安装 2.Linux下设置weblogic监听服务器地址(默认为本机) 1).修改domain\config\config.xml文件 修改 <server> ...

  2. 修改nginx对http请求数据大小限制

    1. 问题发现 在公司搭建了一个基于mindoc的wiki知识库,用nginx做的反向代理服务器,同事在使用过程中上传某个文件一直失败,于是看着看下mindoc自己的日志文件,发现都是类似于fastd ...

  3. 用户线程 (User Thread)、守护线程 (Daemon Thread)

    在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称 ...

  4. bzoj 1050: [HAOI2006]旅行comf&&【codevs1001】

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径上最 ...

  5. 游戏中的过程生成——元胞自动机 Celluar Automata 生成洞穴地形

    最近在学习过程生成技术,在这里写一些心得. 对于元胞自动机,我们这里只讨论输入是一副二维bool数组的情况,即大多数游戏中的情况. 一个元胞自动机,对于一个输入,给出一个同样格式的输出.输出中的每个点 ...

  6. 哈希Hash在字符串中的应用_C++

    本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 哈希大家都会用撒,字符串显然都会写撒,那么哈希离散化字符串不就懂了?!(XXX的神逻辑,其实原文是:树都晓得吧,数组显然都会开呀,那么恭喜 ...

  7. bzoj 1942 斜率优化DP

    首先我们贪心的考虑,对于某一天来说,我们只有3中策略,第一种为不做任何行动,这时的答案与前一天相同,第二种为将自己的钱全部换成a,b货币,因为如果换a,b货币,代表在之后的某一天卖出去后会赚钱,那么当 ...

  8. urlparse获取url后面的参数

    copyfrom: http://www.cnpythoner.com/post/263.html 如果给定你一个URL,比如: http://url/api?param=2&param2=4 ...

  9. Linux终端彩色打印+终端进度条【转】

    转自:https://my.oschina.net/jcseg/blog/178047 开发的一个应用程序选择了终端界面, 为了使软件稍微好看些, 研究下Linux终端的彩色打印, 并且基于这个彩色打 ...

  10. YSlow安装兼容的环境版本

    YSlow:网站性能评分工具 1.安装 Firefox 282.安装 Firebug1.2.83.安装 YSlow3.1.8.1