Frage

Was ich über das Application.Idle-Ereignis weiß, ist, dass die Anwendung ihre Verarbeitung beendet und kurz vor dem Eintritt in den Ruhezustand steht.

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

Bedeutet dies, 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 die Datenbankaktualisierung während der Leerlaufzeit durchgeführt?

private void Application_Idle(object sender, EventArgs e)
{
    // Update the explorer's menuitems
    team.UpdateMenu();

    // Update display toolbars.
    team.UpdateToolBar();

    // Update SaveAll
    SaveAll.Enabled = teaj.IsModified;

    Up.Enabled = team.CanNavigateUp;
    ...

War es hilfreich?

Lösung

Verstehen Sie zunächst, dass es bei der Application.Idle nicht um "Thread-Leerlauf" geht, sondern um die Nachrichtenverarbeitung im UI-Thread der Anwendung. (Thread-Leerlauf unterscheidet sich vom Nachrichtenschleifen-Leerlauf)

Ihre WinForms-App wird von einer Nachrichtenschleife gesteuert, die Nachrichten aus einer Warteschlange zieht. Wenn diese Warteschlange geleert wird, wechselt die Nachrichtenschleife in einen ruhigen Zustand und schläft effizient, bis die nächste Nachricht in der Nachrichtenwarteschlange angezeigt wird. Dies hilft, CPU-Verarbeitungsressourcen zu schonen (Zyklen, die durch Drehen in einer Schleife verschwendet werden, entlasten andere Prozesse auf dem Computer, sodass sich alles langsamer anfühlt) und reduzieren den Stromverbrauch / verlängern die Akkulaufzeit des Laptops

Die Nachrichtenschleife Ihrer App erschöpft normalerweise den Rückstand in der Nachrichtenwarteschlange ziemlich häufig - selbst zwischen Tastenanschlägen, wenn Sie in ein Bearbeitungsfeld eingeben.

Das Application.Idle-Ereignis ist zu einem praktischen Ort geworden, um die Aufgaben der Anwendungsverwaltung asynchron mit den primären Vorgängen der App zu erledigen, ohne sich auf mehrere Threads einzulassen.

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

Sie können Code in die Application.Idle Ihrer Winforms-App einfügen, um eine Datenbank oder Netzwerkressource zu überprüfen. Sie müssen jedoch darauf achten, nichts zu tun, was "lange" dauert, denn wenn Sie Application.Idle blockieren, friert Ihre gesamte App-Benutzeroberfläche ein. Verwenden Sie asynchrone Anrufe, anstatt Anrufe zu blockieren.

Beachten Sie außerdem, dass die Rate, mit der das Application.Idle-Ereignis ausgelöst wird, sehr unterschiedlich ist. Je nachdem, was der Benutzer und Ihre Anwendung tun, wird es möglicherweise mehrmals pro Sekunde oder mehrere Sekunden lang nicht ausgelöst. Wenn Sie regelmäßig nach Datenaktualisierungen suchen möchten, sollten Sie anstelle von Application.Idle ein Timer-Ereignis verwenden. Wenn Sie jedes Mal, wenn Application.Idle ausgelöst wird, eine asynchrone Netzwerkanforderung starten, können Sie Ihren Server mit vielen (redundanten) Anforderungen pro Sekunde überfluten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top