CPU 시간을 사용하는 이벤트 리스너입니다
-
05-07-2019 - |
문제
어쩌면 이것은 멍청한 질문이지만 이벤트 청취자는 타이머처럼 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 시간을 사용하지 않습니다. 오히려 그들은 행사에 의해 유발되는 대표입니다. 이벤트에 대한 관심은 시스템에 의해 언급됩니다. 예를 들어 객관적인 C/Cocoa 스타일 대의원에서는 가장 분명하지만 원칙은 거의 모든 곳에서 적용됩니다.
제휴하지 않습니다 StackOverflow