Pregunta

Tal vez esta es una pregunta tonta, pero ¿los oyentes de eventos usan los ciclos de la CPU como un temporizador, o están inactivos hasta que se dispare el evento?

¿Es específico del idioma, o todos los idiomas manejan esto básicamente igual?

Quiero escribir un pequeño servicio que solo haga algo cuando se desencadena un evento de desconexión de la red, y no quiero que el servicio utilice recursos solo para escuchar (aparte de la memoria, por supuesto).

Planeo hacer algo como esto

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
            }           
    }
¿Fue útil?

Solución

En C #, los eventos son simplemente delegados de función (puntero a función), que se llamarán " a petición " y no utilizará ningún ciclo de CPU adicional.

PERO, si se refiere a eventos de monitoreo como:

  • OnConnecitonPending para algunos oyentes de socket.
  • OnWindowMessage para una aplicación de ventana.

Creo que aquellos que usan un hilo para monitorear sus eventos y, por supuesto, costarán CPU extra.

Otros consejos

Los oyentes de eventos no usan ningún tiempo de CPU hasta que el evento se active realmente (y se llame a su controlador de eventos).

No hay un proceso en segundo plano involucrado con un detector de eventos.

Generalmente, los oyentes de eventos que se ajustan a un sistema incorporado de escucha de eventos no usan el tiempo de CPU hasta que se dispara el evento. Más bien, son delegados que son activados por el evento. Su interés en el evento es notado por el sistema. Esto es más obvio, por ejemplo, con los delegados de estilo Objective-C / Cocoa, pero el principio se aplica en casi todas partes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top