2013-10-08 3 views
3

Мне нужно продолжать использовать метод для 24x7. Обычно приложение должно обрабатывать 40 данных за каждую секунду, используя некоторую нить. Я могу использовать while или recursive call ling тот же метод. но в обоих процессах процессор использует слишком высокий уровень почти 95-100%. Я не могу использовать таймер, потому что , тогда потоки обработки не работают должным образом. в соответствии с предоставленным решением многие люди говорят, чтобы использовать время с потоком сна. но если я использую thread sleep , тогда он получает задержку на каждой итерации. Я использую C# 4.0.Каков наилучший способ продолжать использовать метод

мой вопрос: есть ли лучшее решение для сокращения использования процессора?

основной метод:

static void Main(string[] args) 
    { 
    while(true) 
    { 
     processData(); 
     Thread.sleep(1000); 
    // here i use a 1 second sleep just for give a breath of CPU. 
    //But this one second sleep make me delay for enter data processing. 
    // I am looking for a better solution that no sleep time will use and CPU usages will getting low. 
    } 
    } 

//Method should run always 

static string processData() 
{ 
    { 
// Open and close threads to process the data in every second. 
    } 

// processData(); // it can be used for recursive method calling 
} 
+3

', но если я использую thread sleep, тогда он получает задержку на каждой итерации' - Remove' Thread.Sleep' ??? – Habib

+0

Где находятся данные, которые вы обрабатываете? – dasblinkenlight

+0

Ничего плохого в использовании 'Thread.Sleep'. Может быть, вы не используете его в лучшем месте? Например, если ваш код циклически работает и выполняет около 10 раз в секунду, но вам нужно его выполнять только один раз в секунду, а затем просто спать в течение 1 секунды между каждой итерацией. Почему задержка на 1 секунду вызывает проблему? –

ответ

5

, но если я использую нить сон, то он получает задержку в каждой итерации. Я использую C# 4.0.

Вы можете использовать Thread.Sleep(0), который указывает:

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

static void Main(string[] args) 
{ 
    while(true) 
    { 
    processData(); 
    Thread.sleep(0); 
    } 
} 

Это позволит нити отказаться от некоторой обработки для других потоков, предотвратить его от использования 100% CPU, но по-прежнему позволяет ему работать почти на полную скорость.

Обратите внимание, что при любой задержке, в то время как это уменьшит общее использование ЦП, будет замедлить общую пропускную способность. Единственный способ максимизировать пропускную способность - позволить ему вращаться без остановок, что, конечно же, будет очень высоким.

+0

благодарит за комментарии. но это не снижает использование процессора. – riad

+0

@riad Вы можете спать в течение любой продолжительности, и это должно уменьшить общее использование - если в системе ничего не работает, использование 0, скорее всего, не изменит общее использование (но не будет вредно использовать 100% CPU в этом дело). Если это не так, попробуйте использовать 'Thread.Sleep (1)' или 'Thread.Sleep (100)' для задержки в течение более коротких периодов времени, а не полной секунды ... –

+0

спасибо. не могли бы вы предложить любую статью об этой детали? или любую ссылку или сообщение? – riad

0
static void Main(string[] args) 
{ 
    while(true) 
    { 
     var beginTime = DateTime.Now; 
     processData(); 
     var duration = DateTime.Now.Subtract(beginTime); 

     // if you want to run 40 times per second, 
     // you need to spend 1000/40 = 25ms per iteration 
     var sleepDuration = (int)(25 - duration.TotalMilliseconds); 

     if(0 < sleepDuration) 
     { 
      Thread.sleep(sleepDuration); 
     } 
    } 
} 

Edit: как это было предложено в другой ответ, вы могли бы использовать Timer класс, если ваш метод processData() потокобезопасен

+0

- это их способ уменьшить использование процессоров без использования потока сна? В принципе, я не хочу запускать метод 40 раз. этот processData будет работать, когда он завершит это слово внутреннего потока. внутренний поток обрабатывает 40 данных в секунду. которые я не упоминал здесь. Если я использую нить потока, то в этот момент использование ЦП становится низким. Но это снова становится выше, когда код переходит в блок потока. – riad

+0

Тег 'Timer' абстрагирует это для вас, но любой запущенный процесс, который не использует 100% процессора, в конечном счете спящий – Moho

0

Использование System.Threading.Timer вы в состоянии сказать, когда в следующий выполнить, например:

System.Threading.Timer myTimer = new System.Threading.Timer(~~~) 

внутри MyTimer обратного вызова:

myTimer.Change(nextRunTime, newInterval); 

Это запустит код next в nextRunTime, и интервал станет newInterval.

Более подробная информация о методе "Изменить" доступна здесь:

http://msdn.microsoft.com/en-us/library/7hs7492w.aspx

И System.Threading.Таймер:

http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

Наслаждайтесь :)

Извинения, если я быть самонадеянным, я от впечатления, что причина, вы не будете использовать таймер, потому что всегда есть фиксированная задержка , но с помощью этого метода вы можете настроить задержку каждый раз, когда она выполняется.

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

+0

в основном, я уже пытаюсь использовать таймер разными способами. но проблема в том, чтобы правильно выполнить мой код. получить проблемы, чтобы нормально открывать и закрывать потоки и много других проблем. Поэтому я уже решил не использовать таймер в этом случае. Большое спасибо за ваши предложения. Но таймер не является подходящим решением в моем случае. – riad

+0

Хорошо, извиняюсь, если я потратил ваше время на этот ответ. Я посмотрю, смогу ли я найти другие идеи, я много играл с такими вещами :) – XtrmJosh

0

Этот нижеприведенный код может быть подходящим решением в этом случае. Для более подробной информации, пожалуйста, проверьте это link.

   uint loops = 0; 
       while (true) 
       {      
        if (Environment.ProcessorCount == 1 || (++loops % 100) == 0) 
        { 
         processData(); 
         Thread.Sleep(1); 

        } 
        else 
        { 
         processData(); 
         Thread.SpinWait(20); 

        } 
       } 
Смежные вопросы