Il listener di eventi utilizza il tempo della CPU
-
05-07-2019 - |
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
}
}
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.