gpt4 book ai didi

.net Dictionary.Resize() 异常 - 线程安全?

转载 作者:行者123 更新时间:2023-12-04 22:47:54 26 4
gpt4 key购买 nike

我们有一个非常严重的问题,它导致每分钟数以千计的异常。我们有一个运行本地缓存机制的网站,该机制以以下形式保存数据:

protected static IDictionary<int, IList<IInterfaceForData>> m_Data = null;

当我们在这个字典上调用 Add 时,我们得到一个非常奇怪的行为:“ 索引超出数组 ”,当键 100% 不在字典中时:
m_Data.Add(id, new List<IInterfaceForData>());

我们使用这样的锁来保护这个调用:
if(Monitor.TryEnter(m_LockObj, 1000))
{
try
{
m_Data.Add(id, new List<IInterfaceForData>());
}
catch(Exception ex)
{
// log exception
}
finally
{
Monitor.Exit(m_LockObj);
}
}

我们得到这个异常(exception):
   at System.Collections.Generic.Dictionary`2.Resize()     at   System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)       at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)     

我们找不到对此的任何解释,因为异常与 Dictionary 的线程安全有关,并且我们(认为我们)是线程安全的。我们在每个 Add() 和 Remove() 调用上使用 lock() 或 Monitor.TryEnter, m_Data.TryGetValue(...) 除外

任何帮助将不胜感激。

多谢。

最佳答案

似乎在某些时候代码没有锁定并且集合被更改了......你有没有看看System.Collections.Concurrent命名空间?特别是 ConcurrentDictionary类(class)?它是线程安全的,可能会让你免于像这样的奇怪错误或竞争条件等的痛苦

它几乎和普通字典一样工作,除了大多数操作使用“尝试”方法,即 TryGetValue这将尝试获取值并返回 True如果操作有效且 False如果没有,您当然可以检查此值以继续您的逻辑

您应该查看此 msdn 链接,它与您正在执行的操作非常相似:

Implementing a cache with ConcurrentDictionary

提问者当前正在使用带有 ReaderWriterLockSlim 的非并发字典。并将其更改为并发字典。

关于.net Dictionary.Resize() 异常 - 线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5172960/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com