Ob man nun mit einem BackgroundWorker-Thread oder einem Task arbeitet oder einfach nur einen Thread hat und gelegentlich Application.DoEvents() aufruft, das Updaten einer ProgressBar kostet Zeit.
Zeit um die UI neu zu zeichen. Und es ist verschwendete Zeit, wenn der Benutzer den Fortschritt optisch nicht mal sieht.
Man stelle sich vor, man arbeitet eine Liste von 100.000 oder 10.000.000 Einträgen ab und schickt nach jedem einzelnen Eintrag ein Update an die ProgressBar.
Dann ist die Wahrscheinlichkeit, dass das UI-Neuzeichnen länger dauert, als die eigentliche Aufgabe (Invoke() ist eine der zeitfressendsten Methoden in .NET!).
Deshalb sollte man die Updates auf das Notwenige reduzieren und trotzdem dem Nutzer das Feedback geben, dass die Applikation noch arbeitet.
In den meisten Fällen empfielt sich dafür die Prozent-Regel: Zeichne die ProgressBar nur neu, wenn sich mindestens 1% Fortschritt ergeben hat.
Der untenstehende Code demonstriert, wie das ganz simpel geht.
private Int32 GetStep(Int32 maxProgress)
{
Int32 step;
step = 1;
if (maxProgress > 100)
{
step = maxProgress / 100;
if ((maxProgress % 100) != 0)
{
//we don't want to reach 100% before we're done
step++;
}
}
return (step);
}
private void FireProgressValueChanged(Int32 currentProgress, Int32 step)
{
if ((value % step) == 0)
{
//do what you need to do to update your ProgressBar (fire event, ...) for example:
this.ProgressBar.Value = currentProgress;
}
}
Kommentare zum Snippet