Какой точный способ заблокировать поток на определенный период времени? - PullRequest
1 голос
/ 24 августа 2009

Система, над которой я работаю, должна потреблять IEnumerable рабочих элементов, перебирать каждый из них и между ними ждать определенный период времени. Я хотел бы сохранить систему как можно более простой на месте регистрации. То есть, я хотел бы иметь метод, который я могу вызвать в конце блока foreach, который будет блокироваться на определенное время, которое я укажу - но я не хочу использовать Thread.Sleep, потому что невозможно гарантировать точность.

Минимальное количество времени, которое мне нужно заблокировать, составляет 100 мс, но я не хочу, чтобы оно блокировалось дольше, чем это, что я видел в Thread.Sleep иногда (полагаю, из-за времени в контексте переключений контекста и т. д.).

Редактировать: Связано; выполняет ли вызов WaitHandle.Wait со значением тайм-аута то же самое, что Thread.Sleep?

Ответы [ 2 ]

3 голосов
/ 24 августа 2009

Thread.Sleep () имеет точность около 20 мс, дай или забери. Вы не получите ничего лучше без использования (неуправляемых) мультимедийных таймеров. А так как вы просто останавливаете жизнь, которая кажется излишней. Попробуйте сон (80).

Дополнительно: насколько я знаю, все значения тайм-аута имеют то же разрешение, что и Sleep ().

2 голосов
/ 24 августа 2009

Почему именно вам нужно ждать при перечислении?

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

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

Если вы хотите действительно очень точное время ожидания, я предлагаю вам использовать Thread.Sleep (время - 20 мс), а затем заняться ожиданием подходящего времени.

Только операционная система реального времени может дать вам такую ​​точность. Вы можете предположить, что Thread.Sleep имеет точность около 20 мс, поэтому теоретически вы можете спать до нужного времени - фактическое время составляет около 20 мс, а затем вращение в течение 20 мс, но вам придется тратить эти 20 мс. И даже это не гарантирует, что вы получите результаты в режиме реального времени, планировщик может просто вывести ваш поток, когда он собирался выполнить RELEVANT-часть (сразу после вращения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...