C#-Thread.Sleep无法正常工作!
作者:互联网
考虑以下在特定类的每个实例中执行的代码:
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变量来防止此问题,但未成功.
我的想法不多了.谁能帮助我或向我解释这是怎么发生的?
谢谢
解决方法:
_cpuUsage或_ramUsage是否是静态的?或者,也许您已经为他们两个分配了相同的值?如果您可以给我们一个简短但完整的程序来演示问题,那将使事情变得更加清楚.
附带一提,您似乎希望您使用ElementAt(0)可以从字典中删除最早的条目,但是并不能保证如此.
从您正在做的事情来看,最好使用LinkedList< Tuple< DateTime,long>>.或类似.
标签:thread-safety,c 来源: https://codeday.me/bug/20191208/2093434.html