Есть несколько способов сделать это, но зачем вам добавлять задержку? Если бы мы знали, то смогли бы предложить наиболее подходящий способ сделать это.
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)------>
Для других сценариев (например, запуск операций через некоторое время и т. Д.) Проверьте ответ Коди .
Избегайте использования Thead.Sleep, потому что он полностью заблокирует выполнение НИЧЕГО в текущем потоке, пока не истечет время.
Мохаммед Свиллам,
7
@ Мохаммед: да, конечно, он полностью заблокирует протектор. Но иногда это может быть полезно ... это действительно зависит от того, что нужно OP ...
digEmAll
12
Поскольку я не могу опубликовать новый ответ, я хотел бы прокомментировать - Если вы не хотите, чтобы он блокировал программу, вы можете использовать await Task.Delay(milliseconds). Это сработало для меня :)
SaiyanGirl
В моем случае я не мог использовать ожидание, потому что меня вызвали из части программы, написанной кем-то другим. Это не ожидание, но если я «зависну», я могу работать в течение 10 секунд, прежде чем мои вещи будут отключены. Сон 2 секунды работает как шарм;) Так что в некоторых случаях это выход.
ecth
@MohammedElSayed: Ответ зависит от обстоятельств. Все зависит от цели использования. Что касается моего случая, мне нужно приостановить поток на 0,6 секунды, чтобы избежать ограничения индекса при вставке в базу данных.
GunWanderer
61
Используйте таймер с интервалом 2–3 секунды.
У вас есть три различных варианта на выбор, в зависимости от типа приложения, которое вы пишете:
Не используйте, Thread.Sleepесли вашему приложению необходимо одновременно обрабатывать любые входные данные в этом потоке (WinForms, WPF), так как Sleepэто полностью заблокирует поток и не позволит ему обрабатывать другие сообщения. Предполагая, что приложение является однопоточным (как и большинство из них), все ваше приложение перестанет отвечать, а не просто откладывает операцию, как вы, вероятно, предполагали. Обратите внимание, что можно использовать Sleep в чистом консольном приложении, так как нет «событий» для обработки или в отдельном потоке (также Task.Delayлучший вариант).
В дополнение к таймерам, Sleepвы можете использовать Task.Delayасинхронную версию Sleep, которая не блокирует поток от обработки событий (при правильном использовании - не превращайте его в бесконечный сон с помощью .Wait()).
publicasyncvoidClickHandler(...){// whatever you need to do before delay goes here awaitTask.Delay(2000);// whatever you need to do after delay.}
То же самое await Task.Delay(2000)можно использовать в Mainметоде консольного приложения, если вы используете C # 7.1 ( Async main в блогах MSDN ).
Примечание: задержка операции с помощью Sleepпозволяет избежать состояний гонки, возникающих из-за возможного запуска нескольких операций с помощью таймеров / Delay. К сожалению, замораживание приложения на основе пользовательского интерфейса неприемлемо, поэтому вам нужно подумать о том, что произойдет, если вы запустите несколько задержек (т.е. если оно запускается нажатием кнопки) - рассмотрите возможность отключения такой кнопки или отмены таймера / задачи или убедитесь, что задержка операцию можно безопасно выполнять несколько раз.
Если это консольное приложение, Thread.Sleepпредупреждение может быть не таким важным.
Мерлин Морган-Грэм,
1
Существует 4-й таймер: System.Web.UI.Timer , компонент ASP.NET, который через регулярные интервалы выполняет асинхронные или синхронные обратные передачи веб-страниц.
Дэвид
1
Должен быть главный ответ. Если бы у этого был пример использования одного из таймеров, он получил бы больше голосов ...
Меркуцио
Коди Грей, можете ли вы добавить await Task.Delay()версию и встроенный комментарий, который консольное приложение, скорее всего, действительно захочет использовать Sleep(не асинхронно Main) или Delay(асинхронно Main)
Я предпочитаю это 1000 * numSeconds(или просто 3000), потому что это делает более очевидным, что происходит, для тех, кто раньше не использовал Thread.Sleep. Это лучше документирует ваши намерения.
Ответы:
Вы можете использовать
Thread.Sleep()
функцию, напримерэто полностью останавливает выполнение текущего потока на 2 секунды.
Вероятно, наиболее подходящий сценарий
Thread.Sleep
- это когда вы хотите отложить операции в другом потоке, отличном от основного, например:Для других сценариев (например, запуск операций через некоторое время и т. Д.) Проверьте ответ Коди .
источник
await Task.Delay(milliseconds)
. Это сработало для меня :)Используйте таймер с интервалом 2–3 секунды.
У вас есть три различных варианта на выбор, в зависимости от типа приложения, которое вы пишете:
System.Timers.Timer
System.Windows.Forms.Timer
System.Threading.Timer
Не используйте,
Thread.Sleep
если вашему приложению необходимо одновременно обрабатывать любые входные данные в этом потоке (WinForms, WPF), так какSleep
это полностью заблокирует поток и не позволит ему обрабатывать другие сообщения. Предполагая, что приложение является однопоточным (как и большинство из них), все ваше приложение перестанет отвечать, а не просто откладывает операцию, как вы, вероятно, предполагали. Обратите внимание, что можно использовать Sleep в чистом консольном приложении, так как нет «событий» для обработки или в отдельном потоке (такжеTask.Delay
лучший вариант).В дополнение к таймерам,
Sleep
вы можете использоватьTask.Delay
асинхронную версиюSleep
, которая не блокирует поток от обработки событий (при правильном использовании - не превращайте его в бесконечный сон с помощью.Wait()
).То же самое
await Task.Delay(2000)
можно использовать вMain
методе консольного приложения, если вы используете C # 7.1 ( Async main в блогах MSDN ).Примечание: задержка операции с помощью
Sleep
позволяет избежать состояний гонки, возникающих из-за возможного запуска нескольких операций с помощью таймеров /Delay
. К сожалению, замораживание приложения на основе пользовательского интерфейса неприемлемо, поэтому вам нужно подумать о том, что произойдет, если вы запустите несколько задержек (т.е. если оно запускается нажатием кнопки) - рассмотрите возможность отключения такой кнопки или отмены таймера / задачи или убедитесь, что задержка операцию можно безопасно выполнять несколько раз.источник
Thread.Sleep
предупреждение может быть не таким важным.await Task.Delay()
версию и встроенный комментарий, который консольное приложение, скорее всего, действительно захочет использоватьSleep
(не асинхронноMain
) илиDelay
(асинхронноMain
)За 2,3 секунды нужно сделать:
источник
Или с
using
заявлениями:Я предпочитаю это
1000 * numSeconds
(или просто3000
), потому что это делает более очевидным, что происходит, для тех, кто раньше не использовалThread.Sleep
. Это лучше документирует ваши намерения.источник
Thread.Sleep(TimeSpan)
напрямую, без преобразования в int.