Frage

Vielleicht ist das eine dumme Frage, aber tun Ereignis-Listener verwenden CPU-Zyklen wie ein Timer, oder sind sie inaktiv, bis das Ereignis ausgelöst wird?

Ist es sprachspezifische oder haben alle Sprachen verarbeiten diese im Grunde das gleiche?

Ich mag einen kleinen Dienst schreiben, die nur etwas tut, wenn ein Netzwerk trennen Ereignis ausgelöst wird, und ich möchte nicht, die Service-Ressourcen verbrauchen nur (außer Speicher natürlich) zu hören.

Ich plane, so etwas zu tun

using NetworkUtilities;
    ManagementEventWatcher networkAdapterArrivalWatcher = new ManagementEventWatcher("\\root\\wmi","SELECT * FROM MSNdis_NotifyAdapterArrival ");
                    networkAdapterArrivalWatcher.Options.Timeout = new TimeSpan(0,0,5);

    ManagementEventWatcher networkAdapterRemovalWatcher = new ManagementEventWatcher("\\root\\wmi","SELECT * FROM MSNdis_NotifyAdapterRemoval " );
                    networkAdapterRemovalWatcher.Options.Timeout = new TimeSpan(0,0,5);

    ConnectionNotifierHandler handler = new ConnectionNotifierHandler();
                    networkAdapterArrivalWatcher.EventArrived += new EventArrivedEventHandler(handler.Arrived);
                    networkAdapterRemovalWatcher.EventArrived += new EventArrivedEventHandler(handler.Removed);

    //Start watching for events
    networkAdapterArrivalWatcher.Start();
    networkAdapterRemovalWatcher.Start();

    public void Arrived(object sender, EventArrivedEventArgs e)
    {
            using (ManagementBaseObject ev = e.NewEvent)
            {
                //Log the event
            }
    }

    public void Removed(object sender, EventArrivedEventArgs e)
    {
            using (ManagementBaseObject ev = e.NewEvent)
            {
                //Log the event
            }           
    }
War es hilfreich?

Lösung

In C # Ereignisse werden nur funktionieren Delegierten (Zeiger auf Funktion), die als „on demand“ wird und wird keinen zusätzlichen CPU-Zyklus verwendet werden.

Aber, wenn Sie beziehen sich auf die Überwachung Ereignisse wie:

  • OnConnecitonPending für einige Socket-Listener.
  • OnWindowMessage für ein Fenster Anwendung.

Ich glaube, das sicher einen Thread verwenden, um ihre Ereignisse zu überwachen und natürlich werden zusätzliche CPU kosten.

Andere Tipps

Ereignis-Listener verwendet keine CPU-Zeit, bis das Ereignis tatsächlich ausgelöst wird (und Ihre Event-Handler aufgerufen wird).

Es gibt keinen Hintergrundprozess mit einem Ereignis-Listener beteiligt.

Im Allgemeinen Ereignis-Listener konform ein ereignisAbhörSystem eingebaut keine CPU-Zeit verwenden, bis das Ereignis ausgelöst wird. Vielmehr sind sie die Delegierten, die durch das Ereignis ausgelöst werden. Ihr Interesse an der Veranstaltung wird vom System festgestellt. Am deutlichsten wird dies zum Beispiel mit Objective-C / Cocoa-Stil Delegierten, aber das Prinzip gilt fast überall.

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