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.Sleep
jest 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.Sleep
jeśli aplikacja musi przetwarzać dane wejściowe w tym wątku w tym samym czasie (WinForms, WPF), ponieważ Sleep
cał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 Sleep
możesz użyć Task.Delay
wersji 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 Main
metodzie aplikacji konsolowej, jeśli używasz języka C # 7.1 ( główny Async na blogach MSDN ).
Uwaga: opóźnianie operacji Sleep
ma 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 using
oś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.