поток получить 100% процессор очень быстро - PullRequest
7 голосов
/ 20 мая 2011

Я реализую очень простой поток в C #:

private Thread listenThread;

public void startParser()
{
   this.listenThread = new Thread(new ThreadStart(checkingData));
   this.listenThread.IsBackground = true;
   this.listenThread.Start();
}

private void checkingData()
{
   while (true)
   {

   }

}

Тогда я сразу получаю 100% CPU.Я хочу проверить, считываются ли данные датчика внутри цикла while (true).Почему это так?

Заранее спасибо.

Ответы [ 5 ]

15 голосов
/ 20 мая 2011

while (true) - это то, что убивает ваш процессор.

Вы можете добавить Thread.Sleep(X) к себе, чтобы дать процессору немного отдохнуть перед повторной проверкой.

Кроме того, похоже, что вам действительно нуженТаймер.

Посмотрите на один из классов Таймера здесь http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx.

Используйте Таймер с таким большим интервалом вытягивания, какой вы можете себе позволить, 1 секунда, полсекунда.
Вам необходимоКомпромисс между использованием процессора и максимальной задержкой между проверками.

2 голосов
/ 20 мая 2011

Поскольку ваша функция ничего не делает внутри блока while, она захватывает ЦП и, во всех практических целях, никогда не отпускает его, поэтому другие потоки могут выполнять свою работу

private void checkingData()
{
    while (true)
    {
        // executes, immediately
    }
}

Если вы измените его на следующее, вы должны увидеть более разумное потребление ресурсов процессора:

private void checkingData()
{
    while (true)
    {
        // read your sensor data 

        Thread.Sleep(1000);
    }
}
2 голосов
/ 20 мая 2011

Пусть твой цикл спит .Он бегает по кругу и устает.По крайней мере, пусть это будет перерыв в конце концов.

0 голосов
/ 20 мая 2011

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

0 голосов
/ 20 мая 2011

вы можете использовать блокировку очереди. Принятие элемента из очереди блокировки будет блокировать поток до тех пор, пока в очередь не будет помещен элемент. это не стоит ни одного процессора.

с .net4, вы можете использовать BlockingCollection http://msdn.microsoft.com/en-us/library/dd267312.aspx

в версии 4 нет очереди блокировки int .net framework.

вы можете найти множество орудий блокировки очереди, если вы в Google.

вот реализация

http://www.codeproject.com/KB/recipes/boundedblockingqueue.aspx

кстати. откуда приходят данные, которые вы ждете?

EDIT

, если вы хотите проверить файл. Вы можете использовать FileSystemWatcher для проверки его с помощью блока потоков.

если ваши данные поступают из внешнего API и API не блокирует поток, нет способа заблокировать поток, кроме как использовать Thread.Sleep

...