相关疑难解决方法(0)

我什么时候应该使用ConcurrentDictionary和Dictionary?

我总是对选择哪一个感到困惑.当我看到它,我用DictionaryList,如果我想两个数据类型为KeyValue这样我就可以很容易地找到它的价值key,但我总是困惑,如果我要使用一个ConcurrentDictionaryDictionary

在我离开之前没有对此进行太多研究之前我已经尝试过,但似乎谷歌并没有真正得到任何关于Dictionaryvs ConcurrentDictionary但是每个人都有一些东西.

我之前曾问过这样的朋友,但他们所说的只是:" ConcurrentDictionary如果你在代码中使用了很多字典就会使用",我真的不想纠缠他们来更详细地解释它.任何人都可以扩展这个吗?

c# dictionary concurrentdictionary

38
推荐指数
4
解决办法
1万
查看次数

ConcurrentDictionary <TKey,TValue> vs Dictionary <TKey,TValue>

正如MSDN所说

ConcurrentDictionary<TKey, TValue> Class表示可以由多个线程同时访问的键值对的线程安全集合.

但据我所知,System.Collections.Concurrent课程是为PLINQ设计的.

我有Dictionary<Key,Value>保持服务器中的在线客户端,并且当我有权访问它时通过锁定对象使其成为线程安全的.

我可以放心地取代Dictionary<TKey,TValue>通过ConcurrentDictionary<TKey,TValue>我的情况?更换后性能会提高吗?

这里在第5约瑟夫阿尔巴哈利提到,它专为并行编程

  • 并发集合针对并行编程进行了调整.除了高度并发的场景外,传统的集合在所有集合中都优于它们.
  • 线程安全的集合不保证使用它的代码是线程安全的.
  • 如果在另一个线程正在修改它时枚举并发集合,则不会抛出任何异常.相反,你会得到新旧内容的混合.
  • List没有并发版本.
  • 并发堆栈,队列和包类在内部使用链接列表实现.这使得它们比非并发Stack和Queue类的内存效率更低,但对并发访问更好,因为链表有利于无锁或低锁实现.(这是因为将节点插入链表需要更新几个引用,而将元素插入类似List的结构可能需要移动数千个现有元素.)

c# dictionary concurrent-collections c#-4.0

27
推荐指数
2
解决办法
1万
查看次数

ASP.NET Hang - Generic Dictionary并发问题导致GC死锁

在上个月,我们的ASP.NET Web应用程序已停止响应请求,我们不得不重置应用程序池以使其备份.

我们无法确定问题的确切原因,因为服务器的事件日志中没有错误.该网站只是停止响应.

因此,我们一直在使用WinDbg来尝试分析在Tess Ferrandez的博客条目帮助下网站没有响应的内存转储:GC挂起高CPU挂起

通过运行,!threadpool我可以看到以下内容:

CPU utilization: 81%
Worker Thread: Total: 10 Running: 8 Idle: 2 MaxLimit: 400 MinLimit: 160
Work Request in Queue: 1930
--------------------------------------
Number of Timers: 72
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 8 CurrentLimit: 0 MaxLimit: 400 MinLimit: 120
Run Code Online (Sandbox Code Playgroud)

根据Tess在悬挂博客文章中的说法,这表明我们陷入垃圾收集的中间(通常需要纳秒时间),因为处理器显示81%,这是.NET框架设置的内容虽然这是垃圾收集.它设置为this,因为当此值大于80%时,不会生成新线程.此外 - 您可以看到队列中有1930个请求,即使可能有400个工作线程只有10个.

通过运行该!threads命令,我可以看到两个PreEmptive GC设置为禁用的线程:

                                   PreEmptive   GC Alloc                Lock
       ID  OSID ThreadOBJ    State GC           Context       Domain   Count APT Exception
  10    1  18bc 00000000001b9710 …
Run Code Online (Sandbox Code Playgroud)

.net asp.net debugging windbg hang

18
推荐指数
1
解决办法
3832
查看次数

带锁或Concurency词典的字典?

这是优选的在多线程应用程序: 字典与锁定对象或 并发字典

哪个有效,我为什么要使用其中一个?

编辑1:将Guid存储为键,将bool存储为值.

编辑2:超过2个工作线程和一个UI线程.

.net c# concurrency dictionary

6
推荐指数
2
解决办法
3508
查看次数

这个示例线程是否安全?

假设我有一个充当数据缓存的单例类.多个线程将从缓存中读取,并且单个线程将定期刷新它.它看起来像这样:

public sealed class DataStore
{
    public static DataStore Instance { get { return _instance; } }
    public Dictionary<Foo, Bar> FooBar { get; private set; }

    static DataStore() { }
    private DataStore() { }

    public void Refresh() {
        FooBar = GetFooBarFromDB();
    }

    private static readonly DataStore _instance = new DataStore();
}
Run Code Online (Sandbox Code Playgroud)

我的问题基本上是Refresh(),其他线程可能访问时FooBar是否安全?我需要使用锁,还是我的获取和设置操作是原子的?我是否需要显式声明volatile字段来备份我的属性?

PS,如果有人能想到这个问题的更具描述性的标题,我很乐意欢迎它.

编辑:修复了我的例子来明显纠正非原子代码.

.net c# multithreading thread-safety

3
推荐指数
1
解决办法
1356
查看次数

当我插入唯一键时,我需要在 C# 中使用 ConcurrentDictionary 吗?

我有一个场景,所有线程只会在字典中插入唯一键。换句话说,没有两个线程会插入相同的密钥。我也没有任何更新或读取操作。这只是插入。ConcurrentDictionary在这种情况下我需要吗?

c# multithreading dictionary concurrentdictionary

1
推荐指数
1
解决办法
1258
查看次数