2014-02-06 2 views
0

Я пишу приложение .Net Micro Framework, которое запускает таймер, а затем делает вещи каждый раз, когда происходит таймер. Вот код:Повторяет ли Thread.Sleep (200) и Thread.Sleep (1) то же самое?

public void Run() 
{ 
    var timer = new Timer(DoStuff, null, 120000, 120000); 
    while (true) 
    { 
     Thread.Sleep(1); 
    } 
} 

Так каждые две минуты вызывается метод DoStuff. Мне нужен цикл while, чтобы предотвратить выход приложения. Каковы последствия выбора миллисекунд, переданных в Thread.Sleep? Значит ли небольшое значение (например, 1) приложение быстрее реагировать на таймер? Чем большее значение потребляет меньше мощности процессора?

========== ========== EDIT

Я только что вызов я (возможно) использовать вместо цикла в то время как в этом урезанном пример на GHI page about .Net Micro Framework Timers:

Thread.Sleep(Timeout.Infinite); 

Я могу добавить «infinte» в мой список значений, чтобы понять.

+1

Вы не должны использовать «Сон» здесь вообще. Почему вы решили это сделать? –

+0

Это казалось очевидным способом сохранить приложение вживую и ждать таймера. Что бы вы там поставили вместо Давида? – dumbledad

+0

Какой таймер вы используете? Лично я думаю, что я, вероятно, избавлюсь от таймера и вызову 'Thread.Sleep (120000)' в цикле 'while (true)'. –

ответ

0

Непонятно, что вы пытаетесь сделать здесь. Почему бы вам не стрелять по таймеру так часто, как нужно, и выполнять периодическую работу по методу таймера?

Что касается Sleep, по умолчанию он имеет определенную степень детализации, которая следует за титром таймера Windows, поэтому по умолчанию вы не получите разрешение 1 миллисекунды. Да, вызов Sleep 1000 раз, а не один раз, явно стоит больше мощности процессора, но разные, вероятно, не значимы в большинстве сценариев.

+0

Я не уверен, что это очевидно. Что именно делает Thread.Sleep (n)? – dumbledad

+0

@dumbledad Ну, он выполняет код на CPU. Это не * много * кода. Но это код. Помимо работы, необходимой только для выполнения этих инструкций, давления на планировщик потоков и т. Д., Это также требует переключения контекста - ОС должна получить свободное ядро ​​ЦП, остановить его, сохранить все свои регистры в память, а затем загрузить ваши регистры из памяти и начните свою нить. Затем вы запускаете код tidbit для выполнения во время и сна, и отдаете себя другому потоку, требуя другого контекстного переключателя. Вам даже не гарантировано, что он будет запускаться X раз, потому что Сон может вернуться в 1 мс или 15 или ... – Luaan

+0

Спасибо Luaan, что даст отличный ответ. @ 500-internal-server-error, я не понимаю, что вы подразумеваете под «Почему бы вам не запускать таймер так часто, как нужно, и выполнять периодическую работу с помощью метода таймера?» Разве это не то, что делает мой код? – dumbledad