Я всегда вижу людей, использующих Thread.Sleep()
для создания задержек в обработке или чего-то подобного, и люди всегда высмеиваются за их использование таким образом.
Когда разумно/требуется использовать Thread.Sleep()
?
Я всегда вижу людей, использующих Thread.Sleep()
для создания задержек в обработке или чего-то подобного, и люди всегда высмеиваются за их использование таким образом.
Когда разумно/требуется использовать Thread.Sleep()
?
Вы должны называть Thread.sleep()
, когда вам действительно нужна задержка в фоновом потоке.
Не вызывайте его, чтобы помочь синхронизировать (он не будет), не вызывайте его в цикле, чтобы ждать чего-то (он будет медленным) и никогда не вызовет его в потоке пользовательского интерфейса (он будет заморожен).
Когда вам нужно ввести паузу в каком-то некорректном или тестовом коде, Thread.Sleep() в порядке.
В производственном коде лучше всего попробовать другой вариант. Например, если вы пытаетесь что-то сделать с интервалом, используйте один из многих ранее существовавших классов таймера. Если вы пытаетесь сделать паузу, когда пустая входная очередь опущена (и на .NET), вместо этого используйте Monitor.Wait()
и Monitor.Pulse()
.
Подробнее (опять же,.NET-ориентированное) объяснение недостатков Sleep() в этой статье: Thread.Sleep является признаком плохо разработанной программы.
При написании тестового кода. Если вы хотите увидеть, как некоторые функции обрабатываются при вызове несколькими потоками в случайном порядке.
Кроме того, если вы хотите моделировать задержку для тестирования. Скажем, вы хотели проверить индикатор выполнения.
Есть очень мало ситуаций, когда я считаю это приемлемым. В конечном счете это сводится к следующим условиям в моем сознании: другие могут перекликаться с случаями, когда они не применяются, но, как правило, ВСЕ из следующего должно быть правдой для меня использовать Thread.Sleep в производстве ( aka not trivial или test) код:
Он может использоваться для принудительного переключения контекста (с параметром 1) или для перехода к другим темам с более высоким приоритетом (с парнем 0).... но это редко необходимо.
Если вам нужно Thread.Sleep
, у вас может быть неправильный дизайн. Лучше использовать механизмы синхронизации, такие как AutoResetEvent или ManualResetEvent, и ждать событий. Я часто видел, как опрос сделал с Thread.Sleep
, но лучше попытаться использовать события, если это возможно.
Жалобы на использование сна обычно связаны с эффективным (или, скорее, неэффективным) многопоточным дизайном. Многопоточность - это огромный вопрос, и я просто передам вам хорошую книгу (Java Concurrency на практике Goetz).
Если вы хотите задержать свой код обработки в течение фиксированного периода времени, то sleep() - хорошая вещь (однако Timer класс - хороший способ реализации периодического поведения).
Используйте его, когда вам нужна длительная пауза в ваших операциях. Если спецификация говорит "теперь подождите не менее 10 секунд, прежде чем продолжить", затем вызовите sleep (10000). Существует альтернатива - вы можете переписать свой код как механизм состояния, чтобы управление можно было сдавать до тех пор, пока в него не будет запущено событие таймера. Столбиковый конечный автомат очень гибкий и позволяет полностью асинхронно работать. Получаемый "код", вероятно, не будет похож на спецификацию требований каким-либо образом, почти невозможно понять, что происходит, трудно отлаживать и кошмар, чтобы модифицировать, поддерживать и/или расширять, но вы сможете избежать этого неприятного, вызов шаблона "Сон (10000)".
Как уже писали другие, не используйте его для обмена сообщениями в потоке! Все многозадачные ОС имеют множество механизмов sychro, которые более эффективны.
если вы хотите, чтобы поток переставал что-то делать, когда вы делаете бесконечный цикл, вы не хотите, чтобы цикл не останавливался, потому что он также будет потреблять много мощности процессора, добавив thread.sleep в него будет сделайте цикл "сделайте перерыв" и дайте CPU немного отдохнуть ^^.