Як я можу додати затримку до програми в 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
це повністю заблокує потік і не дозволить йому обробляти інші повідомлення. Якщо припустити однопотокове додаток (як і більшість), вся ваша програма перестане реагувати, а не просто затримувати операцію, як ви, напевно, задумали. Зауважте, що може бути нормально використовувати режим "Сон" у чистому консольному застосуванні, оскільки немає "подій" для обробки або на окремій потоці (також 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.