Unendliche while-Schleife mit Form-Anwendung C#
Muss ich laufen, eine unendliche while-Schleife, wenn eine form-Anwendung startet. Ein Formular beginnt so:
public Form1()
{
InitializeComponent();
}
Nun will ich starten Sie eine weitere Funktion, die eine unendliche Schleife von innen mit einem zweiten Schlaf-Zeit:
public void doProcess(){
while(true){
Thread.Sleep(1000);
//other task
}
}
Wie kann ich dies tun? Wenn ich Anrufe doProcess()
im Konstruktor, es zeigt nicht die form. Ich habe versucht zu laufen, die while-Schleife für 10 Iterationen. Die form zeigte sich erst, nachdem alle Iterationen abgeschlossen sind. Ich verstehe nicht, warum es passiert ist.
- Wo sehen Sie berufen sich auf die doProcess Methode? Vor oder nach der InitializeComponent? Und haben Sie versucht, das form_load-Ereignis?
- P. s, verwenden Sie die pascal-Gehäuse "DoProcess"
- Ich verstehe nicht, was genau Sie wollen zu tun.. ich meine, wenn Sie mit der Endlosschleife hat Thread.Sleep(1000) (für 1 Sek), es wird also nicht die form, wie es ist, unendlich zu unter brechen, und wenn Sie setzen es für 10 Iterationen, dann ist es offensichtlich zeigen nach 10 Iterationen. So können Sie bitte etwas Klarheit über die Frage. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie einen neuen thread starten, wie diese:
Obwohl ich schlage vor, Sie Lesen, auf threading, bevor Sie tun. Wenn Sie möchten, aktualisieren Sie das Formular aus einem anderen thread, die Sie verwenden sollten:
Form.Invoke()
.Beispiel:
w
ist die formKurz gesagt, Sie die Blockierung der UI-Thread mit dieser unendlichen Schleife.
Ausführen async:
Einer while(true) kann ein wenig übertrieben für ein update-loop. Ich kann empfehlen, dass Sie möglicherweise verwenden Sie einen Timer, und/oder nutzen Sie die Stornierung Token eifrig Abbrechen Anfragen, die haben zu lange nicht aktualisiert-Benutzeroberfläche mit potenziell veraltete Ergebnisse in Hochleistungs-Szenarien.
E. g.
Es geschieht, weil die ctor nie beendet und so das Formular kann nicht angezeigt werden - ist das nicht offensichtlich?
Wenn du willst für immer/schlafen loop-Zeile, müssen Sie führen Sie es aus.
Nicht warten in der GUI-event-Handler (oder ctors).
Kann Sie nicht Formen.timer?
Sind Sie blockiert den UI thread. Daher die UI kann nicht verarbeitet werden, solange
doProcess
läuft.Wenn Sie verwenden .Net 4.5 verwenden, können Sie asynchrone wartet:
Die sauberere Lösung wäre, einen timer zu verwenden, die ein Ereignis auslöst alle 1 Sekunde. Sie können schalten Sie den timer nach 10 loops.
await Task.Delay(1000);
Du nicht beenden Sie den Konstruktor so dass sich die form nicht zeigen.
Wenn Sie wollen, es zu tun, nach der form zeigt, platzieren Sie Ihren code im Form_Load-Ereignis.
Aber Sie wollen, es zu tun mit hintergrund-thread, so können Sie mithilfe der backgroundworker-Klasse
Konnten Sie es nach dem Initialisieren der Komponente, oder finden Sie das load-Ereignis des Formulars und fügen Sie Ihren code in es