Update Etikett, während die Verarbeitung in Windows Forms
Was ist der beste Weg, um zu aktualisieren, ein Etikett auf einer Windows-Forms-Anwendung während der Verarbeitung?
Ich habe eine Schleife, die einige Verarbeitung in Dateien auf dem system des Benutzers, wenn der Benutzer auf eine Schaltfläche klickt.
foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
{
//Do processing
//Show progress bar
//Update Label on Form, "f.Name is done processing, now processing..."
}
Was wären einige Beispiel-code?
Was genau heißt das? Ist es threading oder Delegierte?
InformationsquelleAutor der Frage Picflight | 2009-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine schnelle Lösung für dich wäre:
Sie wirklich wollen, um zu vermeiden
DoEvents
sonst wirst du Probleme haben, wenn Sie Ihre Benutzer immer wieder drückt Tasten auf dem Formular.InformationsquelleAutor der Antwort Patrick McDonald
Du sollte tun dies in einem anderen thread, und dann aktualisieren Sie Ihre UI-thread von diesem thread. Sie blockieren die weitere Verarbeitung mit der Durchführung dieser Arbeit auf dem UI-thread.
Wenn Sie nicht bewegen Sie diesen code im UI-thread, dann könnte man immer anrufen
Anwendung.DoEvents
aber ich stark empfehlen Ihnen, erkunden Sie diese Optionen:System.ComponentModel.BackgroundWorker
System.Threading.ThreadPool
System.Threading.Thread
System.Threading.Tasks
- namespaceInformationsquelleAutor der Antwort casperOne
Werden Sie brauchen, um Ihre Daten von einem thread zum anderen. Diese kann getan werden, in ein paar Möglichkeiten...
Ersten, Ihrem "hintergrund" - thread aktualisieren könnte eine Art "CurrentStatus" string-variable, die es ändert, wie es entlang geht. Sie konnte dann einen timer auf deine form, dann greifen die CurrentStatus variable und aktualisieren Sie das Etikett mit.
Zweitens könnte Sie einfach aufrufen, den Vorgang aus dem hintergrund-thread in den UI-thread mit einem Delegaten mithilfe der InvokeRequired-Eigenschaft des label-Steuerelements. So zum Beispiel...
Können Sie nennen, die UpdateStatus () - Methode aus jedem thread (UI-oder hintergrund), und es wird erkennen, ob oder nicht, es muss zum aufrufen der Betrieb auf der main-UI-thread (und wenn ja, ist es).
Um tatsächlich den Faden, die Sie tun können, so wie diese:
Dann, wenn der Benutzer auf die Schaltfläche "GO" werden Sie rufen Sie einfach StartProcessing().
InformationsquelleAutor der Antwort Brandon
Wenn Ihr die Bearbeitung ist langwierig, tun Sie es in einem backgroundworker-thread.
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
InformationsquelleAutor der Antwort devSpeed