Thread.Sleep не работает! - PullRequest
       2

Thread.Sleep не работает!

3 голосов
/ 18 февраля 2011

рассмотрим следующий код, который выполняется в каждом экземпляре определенного класса:

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 значений в каждый словарь выдается «элемент с таким же ключом уже существует в словаре». Это должно быть невозможно, так как я делаю Sleep после каждого цикла. Я безуспешно пытался предотвратить эту проблему, добавив переменную updateDateTime.

У меня заканчиваются идеи. Кто-нибудь может мне помочь или объяснить, как это может произойти?

Спасибо

1 Ответ

3 голосов
/ 18 февраля 2011

Являются ли _cpuUsage или _ramUsage статичными случайно? Или, может быть, вы присвоили им одинаковое значение? Если бы вы могли дать нам короткую, но полную программу, которая демонстрирует проблему, она бы прояснила ситуацию.

Кстати, вы надеетесь, что использование ElementAt(0) удалит самую раннюю запись из словаря, но это не гарантируется.

Из того, что вы делаете, это выглядит , как будто вам лучше с LinkedList<Tuple<DateTime, long>> или подобным.

...