So fügen Sie eine Verzögerung für 2 oder 3 Sekunden hinzu [geschlossen]

129

Wie kann ich einem Programm in C # eine Verzögerung hinzufügen?

Mulder
quelle
2
Es gibt verschiedene Möglichkeiten, dies zu tun. Warum müssen Sie jedoch eine Verzögerung hinzufügen? Wenn wir das wüssten, könnten wir den am besten geeigneten Weg vorschlagen, dies zu tun.
ChrisF
3
Diese Frage ist hoffnungslos unterdokumentiert, um Thread.Sleep () jemals zu empfehlen.
Hans Passant
1
Nur zur Klarstellung habe ich dafür gestimmt, diese Frage zu schließen, weil Sie nicht genügend Details angegeben haben, damit jemand eine gute, qualitativ hochwertige Antwort geben kann. Ich bin durchaus bereit, es als gültige Frage erneut zu öffnen, wenn Sie genau angeben, was Sie tun möchten. Eine frühzeitige Abstimmung ist ein Weg, um eine Flut von "Lärm" -Antworten auf Fragen von schlechter Qualität zu verhindern. Wenn Sie weitere Details hinzugefügt haben, hinterlassen Sie mir einen Kommentar und / oder markieren Sie einen Mod, damit er wieder geöffnet wird.
Cody Gray
14
Schlechte Entscheidung, diese Frage zu schließen. Es ist eine Frage, und es ist in Ordnung, dass sie generischer Natur ist. Ich habe es perfekt verstanden.
user2430797
5
Noch eine Frage, nach der ich gesucht habe, beantwortet durch eine Frage, die ohne Grund geschlossen wurde.
Glenn Maynard

Antworten:

176

Sie könnten eine Thread.Sleep()Funktion verwenden, z

int milliseconds = 2000;
Thread.Sleep(milliseconds);

dass vollständig stoppt die Ausführung des aktuellen Threads für 2 Sekunden.

Das wahrscheinlich am besten geeignete Szenario Thread.Sleepist, wenn Sie die Vorgänge in einem anderen Thread verzögern möchten, anders als im Hauptszenario, z. B.:

 MAIN THREAD        --------------------------------------------------------->
 (UI, CONSOLE ETC.)      |                                      |
                         |                                      |
 OTHER THREAD            ----- ADD A DELAY (Thread.Sleep) ------>

Für andere Szenarien (z. B. Starten des Betriebs nach einiger Zeit usw.) überprüfen Sie Codys Antwort .

digEmAll
quelle
13
Vermeiden Sie die Verwendung von Thead.Sleep, da der aktuelle Thread bis zum Ende der Dauer vollständig daran gehindert wird, ALLES zu tun.
Mohammed Swillam
7
@Mohammed: Ja, natürlich wird das Profil komplett blockiert. Aber manchmal kann es nützlich sein ... es hängt wirklich davon ab, was das OP braucht ...
digEmAll
12
Da ich keine neue Antwort posten kann, möchte ich einen Kommentar abgeben: Wenn Sie nicht möchten, dass das Programm blockiert wird, können Sie es verwenden await Task.Delay(milliseconds). Das hat bei mir funktioniert :)
SaiyanGirl
In meinem Fall konnte ich wait nicht verwenden, da ich von einem Teil des Programms aufgerufen wurde, der von jemand anderem geschrieben wurde. Es ist nicht zu erwarten, aber wenn ich "hänge", kann ich 10 Sekunden lang arbeiten, bevor meine Sachen heruntergefahren werden. 2 Sekunden schlafen funktioniert wie ein Zauber;) In einigen Fällen ist dies der Weg.
ecth
@MohammedElSayed: Die Antwort ist abhängig. Es hängt alles von der Absicht der Verwendung ab. In meinem Fall muss ich den Thread genau 0,6 Sekunden lang in den Ruhezustand versetzen, um eine Indexbeschränkung beim Einfügen in die Datenbank zu vermeiden.
GunWanderer
60

Verwenden Sie einen Timer mit einem Intervall von 2 bis 3 Sekunden.

Sie haben drei verschiedene Optionen zur Auswahl, je nachdem, welche Art von Anwendung Sie schreiben:

  1. System.Timers.Timer
  2. System.Windows.Forms.Timer
  3. System.Threading.Timer

Nicht verwenden, Thread.Sleepwenn Ihre Anwendung Eingaben in diesem Thread gleichzeitig verarbeiten muss (WinForms, WPF), da dies Sleepden Thread vollständig blockiert und verhindert, dass er andere Nachrichten verarbeitet. Unter der Annahme einer Single-Threaded-Anwendung (wie die meisten) reagiert Ihre gesamte Anwendung nicht mehr, anstatt nur einen Vorgang zu verzögern, wie Sie es wahrscheinlich beabsichtigt haben. Beachten Sie, dass es möglicherweise in Ordnung ist, Sleep in einer reinen Konsolenanwendung zu verwenden, da keine "Ereignisse" zu behandeln sind oder sich in einem separaten Thread befinden (dies ist auch Task.Delayeine bessere Option).

Zusätzlich zu Timern und SleepSie können Task.Delaydie asynchrone Version verwenden Sleep, die den Thread nicht daran hindert, Ereignisse zu verarbeiten (wenn sie richtig verwendet werden - verwandeln Sie sie nicht in unendlichen Schlaf mit .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.
 }

Dasselbe await Task.Delay(2000)kann in einer MainMethode einer Konsolenanwendung verwendet werden, wenn Sie C # 7.1 ( Async main in MSDN-Blogs ) verwenden.

Hinweis: Das Verzögern des Betriebs mit Sleephat den Vorteil, dass Rennbedingungen vermieden werden, die sich aus dem potenziellen Starten mehrerer Vorgänge mit Zeitgebern ergeben Delay. Leider ist das Einfrieren der UI-basierten Anwendung nicht akzeptabel. Sie müssen daher überlegen, was passieren wird, wenn Sie mehrere Verzögerungen starten (dh wenn sie durch einen Klick auf eine Schaltfläche ausgelöst werden). Deaktivieren Sie diese Schaltfläche oder brechen Sie den Timer / die Aufgabe ab oder stellen Sie sicher, dass sie verzögert ist Der Betrieb kann mehrmals sicher durchgeführt werden.

Cody Grey
quelle
5
Wenn es sich um eine Konsolenanwendung handelt, ist die Thread.SleepWarnung möglicherweise nicht so wichtig.
Merlyn Morgan-Graham
1
Es gibt einen vierten Timer: System.Web.UI.Timer , eine ASP.NET-Komponente, die in regelmäßigen Abständen asynchrone oder synchrone Webseiten-Postbacks durchführt.
David
1
Sollte die beste Antwort sein. Wenn dies ein Beispiel für die Verwendung eines der Timer hätte, würde es mehr Stimmen bekommen ...
Mercutio
Cody Gray, können Sie hinzufügen await Task.Delay()Version und Inline - Kommentar , dass Konsolenanwendung tatsächlich wahrscheinlich wollen zu verwenden Sleep(non-async Main) oder Delay(async Main)
Alexei Levenkov
1
@CodyGray fertig.
Alexei Levenkov
39

Für 2,3 Sekunden sollten Sie Folgendes tun:

System.Threading.Thread.Sleep(2300);
Mitja Bonca
quelle
6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

Oder mit usingAussagen:

Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);

Ich bevorzuge dies 1000 * numSeconds(oder einfach 3000), weil es offensichtlicher macht, was mit jemandem los ist, der es noch nicht benutzt Thread.Sleephat. Es dokumentiert besser Ihre Absicht.

Merlyn Morgan-Graham
quelle
2
+1 für TimeSpan über 1000 *
Lefty
Ab .NET 4 können Sie Thread.Sleep(TimeSpan)direkt verwenden, ohne in einen Int umwandeln zu müssen.
Holf