c # Fortschrittsbalken wird nicht aktualisiert

8

Ich habe ein ProgressBarWindow, das einen Fortschrittsbalken und eine Abbrechen-Schaltfläche enthält, mit denen ich den Fortschritt der Datei-I / O melden kann. Der UI-Thread von ProgressBarWindow und mein Hauptfenster hängen jedoch trotz aller Arbeit, die in einem Hintergrundarbeiter erledigt wird. Die Fortschrittsleiste wird wie mein Hauptfenster gerendert, aber nicht aktualisiert, während der Hintergrundarbeiter seine Sache macht. Der folgende Code wird am Ende des Konstruktors des Hauptfensters aufgerufen:

%Vor%

EventCountLogLinesProgressChanged () sieht folgendermaßen aus:

%Vor%

Hier ist eine verkürzte Version von ProgressBarWindow (der Rest ist nur ein paar Setter):

%Vor%

Ich habe versucht, die Wert Setter-Zeile in einem Dispatcher.Invoke Delegat, aber das gibt mir einen Stack-Überlauf (ich sollte nicht unbedingt eine dispatcher.invoke Zeile sowieso als Hintergrundarbeiter ProgressChanged im UI Thread aufrufen, richtig? ). Ich habe MSDN überprüft und gegoogelt, aber ich kann nicht scheinen, jemand anderes mit diesem Problem zu finden.

BEARBEITEN Entschuldigung, ich habe nicht bemerkt, dass mein vereinfachter Code den UI-Thread blockiert hat, ich bekomme genau das gleiche Verhalten, obwohl ich einen Hintergrundarbeiter verwende, also nahm ich fälschlicherweise an, dass sie gleichwertig sind. Ich hätte erwähnen sollen, dass ich einen Backgroundworker benutzte: P

    
CalumMcCall 02.08.2010, 11:00
quelle

2 Antworten

14

Sie blockieren den UI-Thread, sodass die UI erst dann wieder gerendert wird, wenn Ihre Schleife beendet ist.

Verschieben Sie die Hintergrundverarbeitung in einen separaten Thread und verwenden Sie die entsprechenden Dispatcher -Aufrufe (oder BackgroundWorker ), um UI-Aktualisierungsaufrufe an den UI-Thread zurückzuleiten.

Wenn Ihr Fortschrittsbalken wirklich ist, der nur ein Timer sein soll, können Sie ihn mit einer der Timer -Klassen aktualisieren.

EDIT: Okay, jetzt hast du den Code geändert, es sieht okay für mich aus. Es sollte threadsicher sein, da Sie nur die Benutzeroberfläche des Benutzeroberflächenthreads ändern. Gibt Ihr Hintergrundarbeiter regelmäßig Fortschritte in regelmäßigen Abständen an?

    
Jon Skeet 02.08.2010, 11:03
quelle
3

Höre Jon Skeet, Oder Sie rufen manchmal Application.DoEvents () auf, um alle UI-Aktualisierungen im selben Thread vorzunehmen.

    
AlexanderMP 02.08.2010 11:04
quelle

Tags und Links