[.NET] : Thread Safe Collection

 

前言 :

最近为了多执行绪程序分享数据集合,搞的焦头烂额。
主要的问题点卡在,
当有一条执行绪使用 foreach列举数据集合的时候,另外一条执行绪去变更数据集合。
这时候会发生Exception,通知说在列举的同时数据集合被变更。

当下最先想到的解决方案是,使用lock在读写数据集合的时候做锁定。
这样的确可以解决问题,
但是因为不论读写都先lock,这样会降低程序执行的效能。
并且这样的写法,要求使用数据集合的程序代码必须要记得做lock动作,不然会发生错误。

 

上网搜寻到这篇「再谈程序多任务(III)─执行绪安全与数据集合」,刚好解决了我遇到的问题点。:D

整篇文章主要的思路就是,
使用 ReaderWriterLockSlim,建立IEnumerable、IEnumerator接口封装lock动作。
在读取、列举数据集合的时候,做只读的Lock。
在写入数据集合的时候,做写入的Lock并且不允许只读的的Lock。

依照这样的方式建立起来的数据集合,
在使用外观上因为是建立IEnumerable、IEnumerator接口封装lock动作,使用数据集合的程序代码可以不用注意lock动作。
并且读写两种lock分离,可以在大量取数据,少量写数据的情景下,达成最大的效率。

 

本篇文章依照「再谈程序多任务(III)─执行绪安全与数据集合」的思路,整理出可扩展的Thread safe Collection。
留个纪录,也希望能帮助到有同样问题的开发人员。 :D

 

程序代码 :

ThreadSafeReaderWriterLock :
首先建立 ThreadSafeReaderWriterLock用来完善 ReaderWriterLock的Dipose功能。
参考数据 : 「再谈程序多任务(I)──升级版的数据锁定和等待机制

 

ThreadSafeEnumerator<T> :
接着建立 ThreadSafeEnumerator<T>,用以处理使用foeach做列举的lock动作。

 

ThreadSafeEnumerable<T> :
再来建立 ThreadSafeEnumerable<T>,来处理读写数据 lock动作。并且他也是后续扩展数据集合的基础对象。

 

ThreadSafeCollection<T> :
这是第一个扩展的数据集合,是以ThreadSafeEnumerable<T>为基础,并且实作ICollection<T>的接口功能。
特别要注意的是,读写数据集合式采用不同的Lock动作。

 

ThreadSafeList<T> :
最后再扩展一个数据集合ThreadSafeList<T> ,是以ThreadSafeCollection<T>为基础,并且实作IList<T>的接口功能。

 

后记 :

依照上面扩展数据集合的方式,可以扩展出例如 IDictionary等等的各种Thread Safe Collection。 :D

posted @   Clark159  阅读(539)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示