事件监听器是否使用CPU时间

时间:2009-09-09 21:00:14

标签: events event-handling event-listener

也许这是一个愚蠢的问题,但是事件监听器是否像计时器一样使用CPU周期,或者在事件被触发之前它们是否处于非活动状态?

是语言特定的,还是所有语言都基本相同?

我想编写一个小型服务,只有在触发网络断开连接事件时才会执行任何操作,并且我不希望服务只是在监听时使用资源(当然不是内存)。

我打算做这样的事情

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
            }           
    }

3 个答案:

答案 0 :(得分:2)

在C#中,事件只是函数委托(指向函数的指针),它将被称为“按需”并且不会使用任何额外的CPU周期。

但是,如果您指的是监控事件,例如:

  • OnConnecitonPending用于某些套接字侦听器。
  • OnWindowMessage用于窗口应用程序。

我认为那些肯定会使用一个线程来监控他们的事件,当然会耗费额外的CPU。

答案 1 :(得分:1)

事件监听器在实际触发事件之前不会使用任何CPU时间(并且会调用您的事件处理程序)。

事件监听器没有涉及后台进程。

答案 2 :(得分:1)

通常,符合内置事件监听系统的事件侦听器在触发事件之前不会使用CPU时间。相反,它们是由事件触发的委托。系统注意到他们对此事件的兴趣。这是最明显的,例如,使用Objective-C / Cocoa风格的代表,但该原则几乎适用于所有地方。