Как добавить задержку в программу на C #?
Как добавить задержку в программу на C #?
Ответы:
Вы можете использовать Thread.Sleep()
функцию, например
int milliseconds = 2000;
Thread.Sleep(milliseconds);
это полностью останавливает выполнение текущего потока на 2 секунды.
Вероятно, наиболее подходящий сценарий Thread.Sleep
- это когда вы хотите отложить операции в другом потоке, отличном от основного, например:
MAIN THREAD --------------------------------------------------------->
(UI, CONSOLE ETC.) | |
| |
OTHER THREAD ----- ADD A DELAY (Thread.Sleep) ------>
Для других сценариев (например, запуск операций через некоторое время и т. Д.) Проверьте ответ Коди .
await Task.Delay(milliseconds)
. Это сработало для меня :)
Используйте таймер с интервалом 2–3 секунды.
У вас есть три различных варианта на выбор, в зависимости от типа приложения, которое вы пишете:
Не используйте, 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
. К сожалению, замораживание приложения на основе пользовательского интерфейса неприемлемо, поэтому вам нужно подумать о том, что произойдет, если вы запустите несколько задержек (т.е. если оно запускается нажатием кнопки) - рассмотрите возможность отключения такой кнопки или отмены таймера / задачи или убедитесь, что задержка операцию можно безопасно выполнять несколько раз.
Thread.Sleep
предупреждение может быть не таким важным.
await Task.Delay()
версию и встроенный комментарий, который консольное приложение, скорее всего, действительно захочет использовать Sleep
(не асинхронно Main
) или Delay
(асинхронно Main
)
За 2,3 секунды нужно сделать:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
Или с using
заявлениями:
Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);
Я предпочитаю это 1000 * numSeconds
(или просто 3000
), потому что это делает более очевидным, что происходит, для тех, кто раньше не использовал Thread.Sleep
. Это лучше документирует ваши намерения.
Thread.Sleep(TimeSpan)
напрямую, без преобразования в int.