Jak mogę dodać opóźnienie do programu w C #?
Jak mogę dodać opóźnienie do programu w C #?
Odpowiedzi:
Możesz użyć Thread.Sleep()funkcji, np
int milliseconds = 2000;
Thread.Sleep(milliseconds);
co całkowicie zatrzymuje wykonywanie bieżącego wątku na 2 sekundy.
Prawdopodobnie najbardziej odpowiednim scenariuszem Thread.Sleepjest to, gdy chcesz opóźnić operacje w innym wątku, innym niż główny, np .:
MAIN THREAD --------------------------------------------------------->
(UI, CONSOLE ETC.) | |
| |
OTHER THREAD ----- ADD A DELAY (Thread.Sleep) ------>
W przypadku innych scenariuszy (np. Rozpoczęcie operacji po pewnym czasie itp.) Sprawdź odpowiedź Cody'ego .
await Task.Delay(milliseconds). To zadziałało dla mnie :)
Używaj minutnika z interwałem ustawionym na 2–3 sekundy.
Masz do wyboru trzy różne opcje, w zależności od typu aplikacji, którą piszesz:
Nie używaj, Thread.Sleepjeśli aplikacja musi przetwarzać dane wejściowe w tym wątku w tym samym czasie (WinForms, WPF), ponieważ Sleepcałkowicie zablokuje wątek i uniemożliwi przetwarzanie innych komunikatów. Zakładając, że jest to aplikacja jednowątkowa (jak większość), cała aplikacja przestanie odpowiadać, a nie tylko opóźni operację, jak prawdopodobnie zamierzałeś. Zauważ, że używanie trybu uśpienia w czystej aplikacji konsolowej może być w porządku, ponieważ nie ma "zdarzeń" do obsłużenia lub w oddzielnym wątku (Task.Delay jest lepsza opcja).
Oprócz timerów i Sleepmożesz użyć Task.Delaywersji asynchronicznej Sleep, która nie blokuje wątku przed przetwarzaniem zdarzeń (jeśli jest używany prawidłowo - nie zamieniaj go w nieskończony sen z .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.
}
To samo await Task.Delay(2000)można wykorzystać w Mainmetodzie aplikacji konsolowej, jeśli używasz języka C # 7.1 ( główny Async na blogach MSDN ).
Uwaga: opóźnianie operacji Sleepma tę zaletę, że pozwala uniknąć sytuacji wyścigu, które wynikają z potencjalnego uruchomienia wielu operacji z licznikami / Delay. Niestety zamrażanie aplikacji opartej na interfejsie użytkownika jest nie do przyjęcia, więc musisz pomyśleć o tym, co się stanie, jeśli uruchomisz wiele opóźnień (tj. Jeśli zostanie wywołane kliknięciem przycisku) - rozważ wyłączenie takiego przycisku, anulowanie timera / zadania lub upewnienie się, że jest opóźnione operację można bezpiecznie wykonać wiele razy.
Thread.Sleep ostrzeżenie może nie być tak ważne.
await Task.Delay()wersję i komentarz w tekście, którego aplikacja konsolowa prawdopodobnie będzie chciała używać Sleep(nie-asynchroniczna Main) lub Delay(asynchroniczna Main)
Przez 2,3 sekundy powinieneś:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
Lub z usingoświadczeniami:
Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);
Wolę to 1000 * numSeconds(lub po prostu 3000), ponieważ dzięki temu jest bardziej oczywiste, co dzieje się z kimś, kto wcześniej nie używał Thread.Sleep. Lepiej dokumentuje twoje zamiary.
Thread.Sleep(TimeSpan)bezpośrednio, bez konieczności rzutowania na int.