也许这是一个愚蠢的问题,但是事件侦听器是否像计时器一样使用 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
            }           
    }
有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top