Як додати затримку на 2 або 3 секунди [закрито]


129

Як я можу додати затримку до програми в C #?


2
Існує кілька способів зробити це, але навіщо потрібно додати затримку? Якби ми знали тоді, ми могли б запропонувати найбільш підходящий спосіб зробити це.
ChrisF

3
Це питання є безнадійно недокументованим, щоб коли-небудь рекомендувати Thread.Sleep ().
Ганс Пасант

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

14
Погане рішення закрити це питання. Це питання, і це нормально, щоб він був родовим за своєю суттю. Я це прекрасно зрозумів.
user2430797

5
Ще одне запитання, яке я шукав, відповів на запитання, яке було закрито без причини.
Гленн Мейнард

Відповіді:


176

Ви можете використовувати 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
@Mohammed: так, звичайно, це повністю заблокує протектор. Але іноді це може бути корисно ... це дійсно залежить від того, що потрібно ОП ...
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це повністю заблокує потік і не дозволить йому обробляти інші повідомлення. Якщо припустити однопотокове додаток (як і більшість), вся ваша програма перестане реагувати, а не просто затримувати операцію, як ви, напевно, задумали. Зауважте, що може бути нормально використовувати режим "Сон" у чистому консольному застосуванні, оскільки немає "подій" для обробки або на окремій потоці (також 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
Існує четвертий таймер: System.Web.UI.Timer , компонент ASP.NET, який виконує асинхронні чи синхронні розсилки веб-сторінок через регулярний інтервал.
Девід

1
Повинно відповісти. Якби це був приклад використання одного з таймерів, він отримав би більше голосів ...
Mercutio

Коді Грей, чи можете ви додати 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 over 1000 *
Lefty

З .NET 4 і далі ви можете користуватися Thread.Sleep(TimeSpan)безпосередньо, не потребуючи передачі в Int.
Гольф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.