考虑在某个类的每个实例化中执行的以下代码:
private void StartUpdateThread()
{
runUpdateThread = true;
Thread thread = new Thread(new ThreadStart(UpdateUsages));
thread.Priority = ThreadPriority.BelowNormal;
thread.Start();
}
public void UpdateUsages()
{
DateTime updateDateTime = DateTime.Now;
while (runUpdateThread)
{
if (updateDateTime <= DateTime.Now)
{
_cpuUsage.Add(DateTime.Now, GetCPUUsage());
if (_cpuUsage.Count == 61)
_cpuUsage.Remove(_cpuUsage.ElementAt(0).Key);
_ramUsage.Add(DateTime.Now, GetRamUsage());
if (_ramUsage.Count == 61)
_ramUsage.Remove(_ramUsage.ElementAt(0).Key);
updateDateTime = DateTime.Now.AddSeconds(15);
}
Thread.Sleep(15000);
}
}
在为每个词典添加2或3个值之后,它会抛出“词典中已存在具有相同键的元素”。这应该是不可能的,因为我在每次循环后都在做睡眠。 我尝试通过添加updateDateTime变量来阻止此问题,但未成功。
我的想法已经不多了。任何人都可以帮助我或解释一下这是怎么发生的吗?
谢谢
答案 0 :(得分:3)
_cpuUsage
或_ramUsage
是否有任何机会静止?或者你可能已经为它们分配了相同的值?如果你能给我们一个简短但完整的程序来证明这个问题,它会让事情变得更加清晰。
在旁注中,您似乎希望您使用ElementAt(0)
将从字典中删除最早的条目,但不能保证这一点。
从您正在做的事情来看,看起来,就像您使用LinkedList<Tuple<DateTime, long>>
或类似物品更好。