使用ConcurrentDictionary多线程同步字典集合实例详解


本文摘自PHP中文网,作者零下一度,侵删。

在之前一段时间里面,我的基类多数使用lock和Hashtable组合实现多线程内缓存的冲突处理,不过有时候使用这两个搭配并不尽如人意,偶尔还是出现了集合已经加入的异常,对代码做多方的处理后依然如故,最后采用了.NET 4.0后才引入的ConcurrentDictionary多线程同步字典集合,问题顺利解决。

1、使用lock和Hashtable组合实现

在我的基类里面,构建业务对象,一般用BLLFactory<T>.Instance就可以获得对应业务对象的应用了。

1

2

var result = BLLFactory<Customer>.Instance.FindFirst();

Console.WriteLine(result.ToJson());

因此使用BLLFactory<T>.Instance这个构建对象后,把它们放到HashTable里面,由于需要设计多线程冲突处理,因此需要使用lock对象来实现锁定的处理。

HashTable表示键/值对的集合。在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key-value键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对,任何非 null 对象都可以用作键或值。

使用这种方式,偶尔在Web端,还是出现多线程访问冲突的问题,为此我们也可以使用多线程的测试代码来进行测试重现错误,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

try{

    List<Thread> list = new List<Thread>();for (int i = 0; i < 10; i++)

    {

        Thread thread = new Thread(() =>{var result = BLLFactory<Customer>.Instance.FindFirst();

            Console.WriteLine(result.ToJson());

            Console.WriteLine();

        });

 

        list.Add(thread);

    }for (int i = 0; i < list.Count; i++)

    {

        list[i].Start();

    }

}catch(Exception ex)

{

    LogTextHelper.Error(ex);

}

跟踪代码得到错误信息如下所示。

阅读剩余部分

相关阅读 >>

浅谈c# 之 hashtable 与 dictionary的代码实例

代码分析:在.net core中使用ref和span<t>提高程序性能

c#线程控制的实例详解

分享一个ioc入门教程实例

c#中多线程之thread类详解

lambda表达式进行对象结合操作的实例详解

使用 vscode 编写 .net core 项目的实例教程

uwp中使用composition api实现吸顶的介绍(二)

c# 多线程--线程池的详细介绍

uwp中使用composition api实现吸顶的实例教程

更多相关阅读请进入《ConcurrentDictionary》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...