Як я можу додати затримку до програми в 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.