Когда разумно использовать Thread.Sleep()? - программирование
Подтвердить что ты не робот

Когда разумно использовать Thread.Sleep()?

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

Когда разумно/требуется использовать Thread.Sleep()?

4b9b3361

Ответ 1

Вы должны называть Thread.sleep(), когда вам действительно нужна задержка в фоновом потоке.

Не вызывайте его, чтобы помочь синхронизировать (он не будет), не вызывайте его в цикле, чтобы ждать чего-то (он будет медленным) и никогда не вызовет его в потоке пользовательского интерфейса (он будет заморожен).

Ответ 2

Когда вам нужно ввести паузу в каком-то некорректном или тестовом коде, Thread.Sleep() в порядке.

В производственном коде лучше всего попробовать другой вариант. Например, если вы пытаетесь что-то сделать с интервалом, используйте один из многих ранее существовавших классов таймера. Если вы пытаетесь сделать паузу, когда пустая входная очередь опущена (и на .NET), вместо этого используйте Monitor.Wait() и Monitor.Pulse().

Подробнее (опять же,.NET-ориентированное) объяснение недостатков Sleep() в этой статье: Thread.Sleep является признаком плохо разработанной программы.

Ответ 3

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

Кроме того, если вы хотите моделировать задержку для тестирования. Скажем, вы хотели проверить индикатор выполнения.

Ответ 4

Есть очень мало ситуаций, когда я считаю это приемлемым. В конечном счете это сводится к следующим условиям в моем сознании: другие могут перекликаться с случаями, когда они не применяются, но, как правило, ВСЕ из следующего должно быть правдой для меня использовать Thread.Sleep в производстве ( aka not trivial или test) код:

  • Ожидание ресурса
  • Данный ресурс не обеспечивает надлежащего проактивного уведомления о готовности (WaitHandle или что-то еще)
  • Вы не можете изменить соответствующий ресурс для этого.
  • Вы измерили и знаете, что вам нужно подождать достаточно долго, чтобы SpinWait не оправдался, и что вы получите лучшую производительность, оставив контекст.

Ответ 5

Он может использоваться для принудительного переключения контекста (с параметром 1) или для перехода к другим темам с более высоким приоритетом (с парнем 0).... но это редко необходимо.

Ответ 6

Если вам нужно Thread.Sleep, у вас может быть неправильный дизайн. Лучше использовать механизмы синхронизации, такие как AutoResetEvent или ManualResetEvent, и ждать событий. Я часто видел, как опрос сделал с Thread.Sleep, но лучше попытаться использовать события, если это возможно.

Ответ 7

Жалобы на использование сна обычно связаны с эффективным (или, скорее, неэффективным) многопоточным дизайном. Многопоточность - это огромный вопрос, и я просто передам вам хорошую книгу (Java Concurrency на практике Goetz).

Если вы хотите задержать свой код обработки в течение фиксированного периода времени, то sleep() - хорошая вещь (однако Timer класс - хороший способ реализации периодического поведения).

Ответ 8

Используйте его, когда вам нужна длительная пауза в ваших операциях. Если спецификация говорит "теперь подождите не менее 10 секунд, прежде чем продолжить", затем вызовите sleep (10000). Существует альтернатива - вы можете переписать свой код как механизм состояния, чтобы управление можно было сдавать до тех пор, пока в него не будет запущено событие таймера. Столбиковый конечный автомат очень гибкий и позволяет полностью асинхронно работать. Получаемый "код", вероятно, не будет похож на спецификацию требований каким-либо образом, почти невозможно понять, что происходит, трудно отлаживать и кошмар, чтобы модифицировать, поддерживать и/или расширять, но вы сможете избежать этого неприятного, вызов шаблона "Сон (10000)".

Как уже писали другие, не используйте его для обмена сообщениями в потоке! Все многозадачные ОС имеют множество механизмов sychro, которые более эффективны.

Ответ 9

если вы хотите, чтобы поток переставал что-то делать, когда вы делаете бесконечный цикл, вы не хотите, чтобы цикл не останавливался, потому что он также будет потреблять много мощности процессора, добавив thread.sleep в него будет сделайте цикл "сделайте перерыв" и дайте CPU немного отдохнуть ^^.