Making progress-bar aktualisiert sich in Echtzeit in wpf
Ich habe einige Probleme bei der progress-Leiste sehen Sie die updates in Echtzeit.
Dies ist mein code jetzt
for (int i = 0; i < 100; i++)
{
progressbar1.Value = i;
Thread.Sleep(100);
}
Aber für einige Grund der Fortschrittsbalken zeigt an, zu leer, wenn die Funktion ausgeführt wird, und dann nichts, bis die Funktion beendet wurde. Kann mir jemand erklären, wie dies getan werden kann? Ich bin neu in C#/WPF-also ich bin nicht 100% sicher, wie ich das umsetzen würden ein Dispatcher über einen anderen thread (wie einige andere posts), um das problem zu beheben.
Klären, mein Programm hat eine Schaltfläche, die beim drücken, schnappt sich den Wert aus einem Textfeld, und verwendet eine API zum abrufen von Informationen, und erstellen Sie Etiketten, die auf ihm basieren. Ich will die Statusleiste zu aktualisieren, nachdem alle Zeilen der Daten ist abgeschlossen.
Dies ist, was ich jetzt haben:
private async void search(object sender, RoutedEventArgs e)
{
var progress = new Progress<int>(value => progressbar1.Value = value);
await Task.Run(() =>
{
this.Dispatcher.Invoke((Action)(() =>
{
some pre-processing before the actual for loop occur
for (int i = 0; i < numberofRows; i++)
{
label creation + adding
((IProgress<int>)progress).Report(i);
}
}));
});
}
Danke!
Loszuwerden, der Dispatcher.Invoke - alles, was Sie tun, ist die Blockierung der UI-thread für den ganzen Betrieb. Fortschritte behandeln soll, die synchronisation.
Das problem ist, dass ohne den Dispatcher.Aufrufen, wenn die Funktion versucht auszuführen, das ist, was kommt. "The calling thread cannot access this object, da in einem anderen thread gehört." Dies geschieht, wenn die Funktion versucht, zuzugreifen, was in eine textbox.
Auf welcher Linie? Machst du andere UI arbeiten dort? Add Dispatcher.Aufrufen, nur auf die Teile, die UI bezogen.
Ja, ich bin Etiketten erstellen und hinzufügen auf dem main grid. Diese verwenden auch einige externe API-tools, um Informationen zu bekommen, die geht in den label-Inhalt.
InformationsquelleAutor nonion | 2015-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit .NET 4.5 oder höher verwenden, können Sie async/await:
Müssen Sie markieren Sie Ihre Methode mit
async
Schlüsselwort verwenden zu könnenawait
zum Beispiel:Ich verstehe nicht ganz, was Sie brauchen, aber das Prinzip ist einfach: setzen Sie alle Ihnen die zeitraubende Arbeit innerhalb
await Task.Run(() => { }
block (Sie können mehrere solcher Blöcke in einer Methode). Und setzen((IProgress<int>)progress).Report(i);
Wann immer Sie wollen, die Statusanzeige zu aktualisieren. Sie können beliebige integer-Wert anstellei
imReport
parameter, und es wird der neue Wert der progress bar.Oh ok vielen Dank für die Hilfe. Ich habe versucht, den code zu kompilieren mit, die umgesetzt werden und ich bekomme diese Fehlermeldung: The calling thread cannot access this object, da in einem anderen thread gehört. Dies ist, wenn ich versuche, ändern Sie die Bezeichnung innerhalb des Gitters.
Klappte, wie es zu beheben. (stackoverflow.com/questions/9732709/...), um das Programm zu kompilieren, aber jetzt das problem das ich immer das gleiche passiert, das ist, dass die bar nicht automatisch aktualisieren
es ist schwer zu sagen, was falsch ist, ohne den eigentlichen code. Bitte aktualisieren Sie Ihren Beitrag mit Ihrem neuen code.
InformationsquelleAutor Aleksey Shubin
Verwaltet, damit es funktioniert. Alles, was ich brauchte, um zu tun ist, anstatt es einfach
Hatte ich gerade zu tun
. By using
Aufgabe.Führen Sie` Sie werden in ein hintergrund thread und Fragen zur Ausführung der worker-Funktion in der UE thread. Kein Wunder, dass die progressbar nicht aktualisiert. In dieser Antwort, die Sie bewegt, die progressbar aktualisieren, um einen hintergrund-thread, damit der Compoundierung der Fehler.Geist teilen Ihre Lösung?
schon geben die richtige Antwort von Aleksey.
in der Tat, diese Antwort ist doppelt falsch - nicht nur Sie verwenden eine veraltete Technik, so ist im Ort eine gute Lösung. Die Frage setzt bereits
Progress< T>
so, dass der code schon ausgeführt wird .NET 4.5,InformationsquelleAutor nonion
Sollten Sie verwenden BackgroundWorker enthalten .NET, die Sie mit Methoden für die Berichterstattung über die Fortschritte von einem hintergrund-thread in einer Veranstaltung. Der thread entstand der BackGroundWorker ruft automatisch dieses Ereignis.
Den Der BackgroundWorker-Klasse.ProgressChanged kann verwendet werden, um zu berichten, den Fortschritt eines asynchronen Vorgangs für den Benutzer.
Siehe MSDN für mehr Informationen über diese.
InformationsquelleAutor Saagar Elias Jacky