Domanda

Forse questa è una domanda stupida, ma i listener di eventi usano cicli CPU come un timer o sono inattivi fino a quando l'evento non viene generato?

È specifico della lingua o tutte le lingue gestiscono sostanzialmente lo stesso?

Voglio scrivere un minuscolo servizio che fa qualsiasi cosa solo quando viene generato un evento di disconnessione dalla rete e non voglio che il servizio utilizzi le risorse solo per l'ascolto (tranne la memoria ovviamente).

Ho intenzione di fare qualcosa del genere

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
            }           
    }
È stato utile?

Soluzione

In C #, gli eventi sono semplicemente delegati di funzioni (puntatore alla funzione), che saranno chiamati "on demand" e non utilizzerà alcun ciclo CPU aggiuntivo.

MA, se ti riferisci al monitoraggio di eventi come:

  • OnConnecitonPending per alcuni listener di socket.
  • OnWindowMessage per un'applicazione per finestre.

Penso che quelli che sicuramente usano un thread per monitorare i loro eventi e ovviamente costeranno CPU extra.

Altri suggerimenti

I listener di eventi non utilizzano alcun tempo CPU fino a quando l'evento non viene effettivamente generato (e viene chiamato il tuo gestore eventi).

Non è coinvolto alcun processo in background con un listener di eventi.

In genere, i listener di eventi conformi a un sistema di ascolto degli eventi integrato non utilizzano il tempo della CPU fino a quando l'evento non viene generato. Piuttosto, sono delegati che vengono attivati ??dall'evento. Il loro interesse per l'evento è notato dal sistema. Questo è ovvio, ad esempio, con i delegati in stile Objective-C / Cocoa, ma il principio si applica praticamente ovunque.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top