Application.Idle Ereignis Signifikanz

8

Was ich über das Ereignis Application.Idle weiß, ist, dass die Anwendung ihre Verarbeitung beendet und gerade in den Leerlaufzustand übergeht.

Ich habe irgendwo gelesen, dass

  

Wenn Sie Aufgaben haben, die Sie ausführen müssen, bevor der Thread wird   Im Leerlauf, hängen Sie sie an dieses Ereignis an

Das bedeutet also, dass die Aufgaben ausgeführt werden, bevor der Thread inaktiv wird oder nachdem der Thread inaktiv wird?

Ich habe ein bisschen Code in meinem Projekt, siehe unten. Wird das Datenbankupdate während der Leerlaufzeit durchgeführt?

%Vor%     
peter 24.03.2011, 05:37
quelle

1 Antwort

19

Verstehen Sie zuerst, dass Application.Idle nicht über "thread idle" ist, sondern über die Nachrichtenverarbeitung im UI-Thread der Anwendung. (Thread-Leerlauf unterscheidet sich von Leerlauf Leerlauf)

Ihre WinForms-App wird von einer Nachrichtenschleife gesteuert, die Nachrichten aus einer Warteschlange abruft. Wenn diese Warteschlange geleert wird, tritt die Nachrichtenschleife in einen Ruhezustand ein und schläft effizient, bis die nächste Nachricht in der Nachrichtenwarteschlange erscheint. Dies spart Ressourcen bei der CPU-Verarbeitung (Zyklen, die beim Schleifen in einer Schleife verschwendet werden, nehmen CPU-Zeit von anderen auf der Maschine laufenden Prozessen weg, so dass sich alles langsamer anfühlt) und tragen dazu bei, den Stromverbrauch zu reduzieren / Akkulaufzeit zu verlängern.

In der Nachrichtenschleife Ihrer App wird das Nachrichtenwarteschlangen-Backlog in der Regel ziemlich häufig verbraucht - sogar zwischen Tastatureingaben, wenn Sie in ein Bearbeitungsfeld tippen.

Das Application.Idle-Ereignis ist zu einem praktischen Ort geworden, an dem asynchron zu den primären Operationen der App Aufgaben der Programmpflege erledigt werden können, ohne sich mit mehreren Threads befassen zu müssen.

Menüs und Schaltflächen werden normalerweise aktiviert oder deaktiviert, um den entsprechenden Befehlszuständen zu entsprechen, wenn beispielsweise die Anwendung inaktiv wird. Da das sichtbare Erscheinungsbild nur in der Benutzerzeit aktualisiert werden muss (der Benutzer kann den Unterschied zwischen den Änderungen des visuellen Zustands nicht genau zum Zeitpunkt der Änderungen des internen Zustands im Vergleich zum Ändern des visuellen Zustands einige Millisekunden später erkennen), ist das Anwendungsleerlaufereignis eine einfache und effektive Möglichkeit, sich um solche Haushaltsarbeiten zu kümmern.

Sie könnten Code in die Application.Idle Ihrer Winforms-App schreiben, um eine Datenbank oder eine Netzwerkressource zu überprüfen. Sie müssen jedoch vorsichtig sein, wenn Sie "lange" nicht tun, da wenn Sie Application.Idle blockieren, Ihre gesamte App UI einfrieren wird. Verwenden Sie Async-Anrufe, anstatt Anrufe zu blockieren.

Beachten Sie auch, dass die Häufigkeit, mit der das Application.Idle-Ereignis ausgelöst wird, sehr unterschiedlich ist. Es kann mehrmals pro Sekunde ausgelöst werden oder nicht für mehrere Sekunden ausgelöst werden, je nachdem, was der Benutzer und Ihre Anwendung tun. Wenn Sie regelmäßig nach Datenaktualisierungen suchen möchten, sollten Sie anstelle von Application.Idle ein Timer-Ereignis verwenden. Wenn Sie bei jedem Start von Application.Idle eine asynchrone Netzwerkanforderung starten, können Sie Ihren Server mit einer Menge (redundanter) Anfragen pro Sekunde überfluten.

    
dthorpe 24.03.2011, 06:08
quelle

Tags und Links