Как добавить задержку на 2 или 3 секунды [закрыто]


129

Как добавить задержку в программу на C #?


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

3
Этот вопрос безнадежно недокументирован, чтобы когда-либо рекомендовать Thread.Sleep ().
Hans Passant

1
Просто для пояснения я проголосовал за закрытие этого вопроса, потому что вы не предоставили достаточно подробностей, чтобы кто-либо мог дать хороший качественный ответ. Я совершенно готов снова открыть его как действительный вопрос, если вы добавите более подробную информацию о том, что именно вы пытаетесь сделать. Голосование за досрочное закрытие - это способ предотвратить поток «шумных» ответов на вопросы низкого качества. После того, как вы добавите больше деталей, оставьте мне комментарий и / или отметьте мод, чтобы он снова открылся.
Коди Грей

14
Плохое решение закрыть этот вопрос. Это вопрос, и это нормально, если он носит общий характер. Я это прекрасно понял.
user2430797

5
Еще один вопрос, который я искал, ответ на который был закрыт без причины.
Гленн Мейнард

Ответы:


177

Вы можете использовать Thread.Sleep()функцию, например

int milliseconds = 2000;
Thread.Sleep(milliseconds);

это полностью останавливает выполнение текущего потока на 2 секунды.

Вероятно, наиболее подходящий сценарий Thread.Sleep- это когда вы хотите отложить операции в другом потоке, отличном от основного, например:

 MAIN THREAD        --------------------------------------------------------->
 (UI, CONSOLE ETC.)      |                                      |
                         |                                      |
 OTHER THREAD            ----- ADD A DELAY (Thread.Sleep) ------>

Для других сценариев (например, запуск операций через некоторое время и т. Д.) Проверьте ответ Коди .


13
Избегайте использования Thead.Sleep, потому что он полностью заблокирует выполнение НИЧЕГО в текущем потоке, пока не истечет время.
Мохаммед Свиллам,

7
@ Мохаммед: да, конечно, он полностью заблокирует протектор. Но иногда это может быть полезно ... это действительно зависит от того, что нужно OP ...
digEmAll

12
Поскольку я не могу опубликовать новый ответ, я хотел бы прокомментировать - Если вы не хотите, чтобы он блокировал программу, вы можете использовать await Task.Delay(milliseconds). Это сработало для меня :)
SaiyanGirl

В моем случае я не мог использовать ожидание, потому что меня вызвали из части программы, написанной кем-то другим. Это не ожидание, но если я «зависну», я могу работать в течение 10 секунд, прежде чем мои вещи будут отключены. Сон 2 секунды работает как шарм;) Так что в некоторых случаях это выход.
ecth

@MohammedElSayed: Ответ зависит от обстоятельств. Все зависит от цели использования. Что касается моего случая, мне нужно приостановить поток на 0,6 секунды, чтобы избежать ограничения индекса при вставке в базу данных.
GunWanderer

61

Используйте таймер с интервалом 2–3 секунды.

У вас есть три различных варианта на выбор, в зависимости от типа приложения, которое вы пишете:

  1. System.Timers.Timer
  2. System.Windows.Forms.Timer
  3. System.Threading.Timer

Не используйте, Thread.Sleepесли вашему приложению необходимо одновременно обрабатывать любые входные данные в этом потоке (WinForms, WPF), так как Sleepэто полностью заблокирует поток и не позволит ему обрабатывать другие сообщения. Предполагая, что приложение является однопоточным (как и большинство из них), все ваше приложение перестанет отвечать, а не просто откладывает операцию, как вы, вероятно, предполагали. Обратите внимание, что можно использовать Sleep в чистом консольном приложении, так как нет «событий» для обработки или в отдельном потоке (также Task.Delayлучший вариант).

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

 public async void ClickHandler(...)
 {
      // whatever you need to do before delay goes here         

      await Task.Delay(2000);

      // whatever you need to do after delay.
 }

То же самое await Task.Delay(2000)можно использовать в Mainметоде консольного приложения, если вы используете C # 7.1 ( Async main в блогах MSDN ).

Примечание: задержка операции с помощью Sleepпозволяет избежать состояний гонки, возникающих из-за возможного запуска нескольких операций с помощью таймеров / Delay. К сожалению, замораживание приложения на основе пользовательского интерфейса неприемлемо, поэтому вам нужно подумать о том, что произойдет, если вы запустите несколько задержек (т.е. если оно запускается нажатием кнопки) - рассмотрите возможность отключения такой кнопки или отмены таймера / задачи или убедитесь, что задержка операцию можно безопасно выполнять несколько раз.


5
Если это консольное приложение, Thread.Sleepпредупреждение может быть не таким важным.
Мерлин Морган-Грэм,

1
Существует 4-й таймер: System.Web.UI.Timer , компонент ASP.NET, который через регулярные интервалы выполняет асинхронные или синхронные обратные передачи веб-страниц.
Дэвид

1
Должен быть главный ответ. Если бы у этого был пример использования одного из таймеров, он получил бы больше голосов ...
Меркуцио

Коди Грей, можете ли вы добавить await Task.Delay()версию и встроенный комментарий, который консольное приложение, скорее всего, действительно захочет использовать Sleep(не асинхронно Main) или Delay(асинхронно Main)
Алексей Левенков

1
@CodyGray готово.
Алексей Левенков


6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

Или с usingзаявлениями:

Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);

Я предпочитаю это 1000 * numSeconds(или просто 3000), потому что это делает более очевидным, что происходит, для тех, кто раньше не использовал Thread.Sleep. Это лучше документирует ваши намерения.


2
+1 для TimeSpan более 1000 *
Lefty

Начиная с .NET 4, вы можете использовать его Thread.Sleep(TimeSpan)напрямую, без преобразования в int.
Holf
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.