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]

C# Grundlagen

Die Schulung vermittelt Ihnen die Grundlagen von C# in der Arbeit mit Datentypen sowie bei Klassenbibliotheken. Sie lernen, mit Variablen umzugehen und deren verschiedene Formen zu konvertieren. 

JavaScript für .NET-Entwickler

Sie sind .NET-Entwickler und nun stehen Sie vor der Aufgabe, JavaScript in Ihre Arbeit einzubinden. Die Schulung vermittelt Ihnen die JavaScript Grundlagen und die Funktionen der Scriptsprache. Sie wissen, wie objektorientierte Programmierung in JavaScript funktioniert und lernen abschließend Best Practicies Fälle kennen.

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!