C# 线程。睡眠不工作!

C# 线程。睡眠不工作!,c#,thread-safety,C#,Thread Safety,考虑在特定类的每个实例化中执行的以下代码: private void StartUpdateThread() { runUpdateThread = true; Thread thread = new Thread(new ThreadStart(UpdateUsages)); thread.Priority = ThreadPriority.BelowNormal; thread.Start(); } public void UpdateUsages() {

考虑在特定类的每个实例化中执行的以下代码:

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);
    }
}
private void StartUpdateThread()
{
runUpdateThread=true;
线程线程=新线程(新线程开始(updateSages));
thread.Priority=ThreadPriority.bellownormal;
thread.Start();
}
public void UpdateUsages()
{
DateTime updateDateTime=DateTime.Now;
while(runUpdateThread)
{

如果(updateDateTime是
\u cpuUsage
\u ramUsage
静态的?或者您为这两个都分配了相同的值?如果您能给我们一个简短但完整的程序来演示问题,这将使事情更加清楚

另一方面,您似乎希望使用
ElementAt(0)
将从字典中删除最早的条目,但这并不能保证


从您正在做的事情来看,您最好使用
LinkedList
或类似的工具。

另一方面,您的DateTime.Now调用可能会返回不同的时间。您想调用它一次,将值保存在变量中,然后重新使用它,至少在
while
循环中是这样。要获得好的答案,请尝试post good问题。请通过文本或扩展示例代码回答以下问题:您是否从其他线程访问数据结构?如果是,什么类型的访问,只读或读/写?如何使用“\u cpuUsage”和“\u ramUsage”定义?您是启动多个这样的线程还是只启动一个线程?考虑到这一点,那么,如何可能在不同的循环上获得该异常?考虑什么?“不同的循环”你是在多个线程上运行代码吗?1.我正在从其他线程读取_cpuUsage和_ramUsage..只在while循环上进行写入。如果类型是字典,则不会进行其他写入,他是否会看到该代码中的错误类型,尽管它可能已被破坏,但仍然存在?@Lasse:如果有多个线程访问同一个线程字典(如果变量是静态的,并且有多个实例),那么它可以解释一些事情。看到更多的代码肯定会有帮助。是的,如果多个线程正在编写,他很可能会尝试复制键,或者他可能会破坏状态,这是毫无希望的。啊,我没有注意到,“在每个实例上”.如果那些字典是共享的,他需要锁定,没有办法。