Feedback

C# - ProgressBar vernünftig updaten

Veröffentlicht von am 27.11.2014
(1 Bewertungen)
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.
GFU-Schulungen  [Anzeige]

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

ASP.NET 2.0 und 3.5

Dieser Kurs vermittelt Ihnen alle Erweiterungen von Microsoft ASP.NET 2.0. Zu diesen zählen u. a. Data Bindung, Master Pages, und Security.

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;
    }
}
Abgelegt unter responsiveui.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!