添加和删​​除条目后枚举ConcurrentDictionary会导致高CPU

时间:2014-10-16 20:43:04

标签: c# .net

我的程序遇到了一个问题,即在处理大量数据后,它会继续使用比平常更多的CPU。我将问题追溯到一段代码,该代码枚举ConcurrentDictionary

我知道这会在枚举字典时导致CPU使用率过高而它拥有数百万个条目,但是当CPU使用率没有下降到字典后的原始级别时,我引起了人们的注意。已经倒空了。在大规模添加 -​​ 然后删除之后,似乎字典在幕后做了很多工作,但为什么呢?在添加任何内容之前枚举字典时,CPU使用率保持在0%。

为什么会这样?我能做些什么来阻止它发生吗?

这是一个重现问题的代码段:

var dict = new ConcurrentDictionary<string, object>();

const int count = 3000000; // High CPU.
//const int count = 100; // No issues.

for (int i = 0; i < count; i++)
{
    dict.TryAdd(i.ToString(), null); // Add lots of entries.
}
for (int i = 0; i < count; i++)
{
    object nullObj;
    dict.TryRemove(i.ToString(), out nullObj); // Then remove them all.
}

GC.Collect();
Debug.Assert(dict.IsEmpty);

Console.WriteLine("Enumerating");
while (true)
{
    // Enumerate the dictionary. Takes up lots of CPU despite being empty,
    // but only if lots of entries were added then removed.
    foreach (var kvp in dict) { /* Empty. */ }

    Thread.Sleep(50);
}

0 个答案:

没有答案