7 Stimmen

C# Ruhezustand für 500 Millisekunden

Könnten Sie mir bitte sagen, wie ich mein Programm für 500 Millisekunden pausieren und dann fortsetzen kann?

Ich lese Thread.Sleep(500) ist nicht gut, da es den GUI-Thread aufhält.

Mit Hilfe eines Timers wird ein Rückruf ausgelöst ...

Ich möchte nur 500 ms warten und dann mit der nächsten Anweisung fortfahren.

Bitte beraten Sie mich.

EDIT: Ich muss eine Statusleistenmeldung für 500ms anzeigen und dann die Meldung mit einer anderen aktualisieren. Entschuldigung, ich meinte 500 und nicht 50.

EDIT: Ich verstehe, was Sie alles gesagt haben. aber: [Ich denke, weil es so ein kurzes Intervall ist, werde ich ein Thread.Sleep(500) auf dem Haupt-GUI-Thread ausführen, um 500ms zu warten und dann mit der nächsten Anweisung fortzufahren. Ansonsten müsste ich eine Menge Code umschreiben, um dieses kurze Intervall von 500 Millisekunden unterzubringen.

EDIT: Ich werde versuchen, meine Statusmeldung so umzuformatieren, dass die Pause nicht mehr nötig ist.

6voto

Hans Passant Punkte 894572

Hmya, was Sie vorhaben, ist mit dem Windows-Programmiermodell grundsätzlich unvereinbar. Ein natives Windows-Programm ist ereignisgesteuert. Ihr Programm ist immer im Leerlauf, sitzt in einer Schleife, die von Application.Run() gestartet wird, und wartet darauf, dass Windows ihm mitteilt, dass etwas Interessantes passiert ist, auf das es reagieren soll. Malanfragen, Mausklicks, Ablauf von Timern und dergleichen.

Ihr Programm sollte darauf reagieren und herausfiltern, was für Sie interessant ist. Wenn Sie eine Schaltfläche in ein Formular einfügen, sind Sie immer interessiert sich für das Click-Ereignis, das erzeugt wird, wenn Windows die MouseDown-Benachrichtigung sendet. Ihr Click-Ereignishandler führt eine Art von benutzerdefiniertem Code aus, den Sie schreiben. In Ihrem Fall z. B. das Aktualisieren einer Meldung in der Statusleiste.

Die Aktualisierung der Meldung in der Statusleiste eine halbe Sekunde später macht nicht viel Sinn. Was genau ist in diesen 500 Millisekunden passiert, das die Art und Weise, wie Ihr Programm auf Ereignisse reagiert, verändert hat? Sie können die Update()-Methode der Statusleiste aufrufen, damit die neue Meldung sichtbar wird, und dann System.Threading.Thread.Sleep(500) aufrufen, um das zu erhalten, was Sie wollen. Sie kommen damit durch, das "Not Responding"-Gespenst, das Windows aufstellt, nimmt Ihr Programm für einige Sekunden in Beschlag.

Aber das macht nicht viel Sinn, denn in dieser halben Sekunde ist nichts passiert, der Zustand Ihres Programms hat sich nicht geändert. Es konnte sich nicht ändern, da es für Windows tot war und keine Nachrichten empfing, die eine Zustandsänderung ermöglicht hätten.

Nun, mehr kann ich dazu nicht sagen. Bitte aktualisieren Sie Ihre Frage und erklären Sie, warum Sie dies tun müssen. Nur für den Fall: Wenn Sie dies in Erwägung ziehen, um eine halbe Sekunde lang etwas Wichtiges vorzutäuschen, wird Ihr Benutzer nicht beeindruckt sein. Er wird irgendwann bemerken, dass Ihre Benutzeroberfläche eine halbe Sekunde lang tot ist, ohne dass es etwas zu sehen gibt.

5voto

Mark Byers Punkte 761508

選択肢は2つ。

  • Verwenden Sie einen Timer, wie Sie vorgeschlagen haben. Teilen Sie Ihre Methode in zwei Methoden auf, foo1 und foo2. Verwenden Sie foo1 zum Starten des Timers und führen Sie foo2 im Callback aus.
  • Verwenden Sie eine BackgroundWorker für die Ausführung der gesamten Funktion und verwenden Sie Thread.Sleep für den Worker-Thread.

Aus Ihrer Aktualisierung geht hervor, dass Sie nur ein einziges Feld ändern wollen. Ich würde auf jeden Fall die erste Methode empfehlen: die Verwendung eines Timers. Das Starten eines BackgroundWorkers für diese Aufgabe ist übertrieben und wird Ihnen nur unnötige zusätzliche Arbeit und Komplikationen bereiten.

4voto

Justin Ethier Punkte 126797

Anstatt die Benutzeroberfläche direkt für 500 ms anzuhalten, können Sie jederzeit eine BackgroundWorker . Das führt dazu, dass Ihr Callback in einem separaten Thread läuft, in dem Sie mit Thread.Sleep um sie anzuhalten, ohne die Benutzeroberfläche zu blockieren. Wenn Sie dann fertig sind, aktualisieren Sie einfach die Statusleiste mit Ihrer neuen Nachricht.

2voto

Aaron Daniels Punkte 9389

Es wäre hilfreich, die Frage in einen größeren Zusammenhang zu stellen.

Thread.Sleep(50) hält den aktuellen Thread für 50 Millisekunden an. Wenn Sie dies im UI-Thread tun, dann ja, es wird die UI für 50 Millisekunden einfrieren. Wenn Sie jedoch einen anderen Thread für diese Verarbeitung verwenden, wird der Aufruf von Sleep auf diesem Thread hält diesen für 50 Millisekunden an, ohne dass Ihr UI-Thread einfriert.

Siehe Marcs Antwort auf este Frage für ein Beispiel zur Verwendung einer BackgroundWorker Instanz zu tun, was Sie brauchen.

2voto

Brian Punkte 115257

In C# ist es am besten, den Timer zu verwenden und einen Rückruf auszulösen.

In F# gibt es eine großartige Möglichkeit, das zu tun, was Sie wollen, siehe

F# async auf der Client-Seite

in dem gezeigt wird, wie man geradlinigen Code schreibt und die Sprache die Rückrufe für einen erledigen lässt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X