重现“非并发集合必须具有独占访问权限”异常

won*_*rld 7 c# collections dictionary thread-safety

我在生产应用程序中描述了https://dotnetfiddle.net/GknA5Q中的以下代码。用作缓存dictionary来保存对象的属性。使用此功能的REST API有数百种对象类型,因此当 API 找到更多对象类型时,缓存会变得更大。正如您在代码中看到的那样,对象的属性是通过反射检索的。当 API 启动并且数百个请求到达 API 时,就会填充这些内容。每个请求都会有一个对象类型,其属性会被缓存。dictionarydictionary

尽管 REST API 可以工作,但当 API 在 IIS 中启动时,代码现在会生成以下错误。生成错误的行号是TryGetValue被调用的23。

更改非并发集合的操作必须具有独占访问权限。对此集合执行并发更新并破坏了其状态。集合的状态不再正确。

我试图在测试应用程序中重现相同的错误,因此可以应用一些解决方案。我不想删除这dictionary会增加处理到达 API 的每个请求中的每个模型的时间。如果该dictionary缓存可用,则可以从缓存中检索属性,而不是通过反射进行解析。

我怎样才能重现上述错误?

Man*_*uel 8

该类Dictionary<TKey, TValue>支持多个读取器,但不支持多个写入器。

您可以在这里阅读官方文档:Dictionary<TKey,TValue> 类 - 线程安全

要测试并发性,您可以使用该类Parallel:Parallel Class

Parallel.For(0, 1000, i =>
{
     // dictionary.Add(...)
});
Run Code Online (Sandbox Code Playgroud)

该类的线程安全实现IDictionary<TKey, TValue>是ConcurrentDictionary<TKey, TValue>:
ConcurrentDictionary<TKey,TValue> 类

您只需要将Dictionary代码替换为ConcurrentDictionary.