2009-10-08 3 views
7

비동기 작업 (일련의 네트워크 IO)에 대한 시간 제한을 구현하고 있는데, 할당/성능 측면에서 '더 나은'것이 확실하지 않습니다. EventWaitHandle 및 RegisterWaitForSingleObject를 사용하거나 타이머를 만들고 Tick을 사용합니다..Net 시간 초과 : WaitForSingleObject 대 타이머

특정 경우에 EventWaitHandle은 게으르며 생성되지만 분명히 WaitForSingleObject를 사용하려면 인스턴스화해야합니다. 그래서 이것은 WaitHandle + WaitForSingleObject 대 Timer의 자원 비용에 대한 질문입니다. 두 가지 방법 모두 구현하기가 쉽습니다.

나는 다양한 시간에 두 가지를 구현했기 때문에 지형을 이해할 수 있으며 어떤 방법이 '더 나은'것인지 확실하지 않습니다.

답변

3

Microsoft의 Morgan Skinner seems to prefer RegisterWaitForSingleObject.

는까지 할당에 관한 한, 반사기 타이머 내부 TimerBase뿐만 아니라 _TimerCallback라는 클래스를 생성하면서 RegisterWaitForSingleObject하기, RegisteredWaitHandle의 인스턴스를 생성 할 것을 보여준다. 하나는 계속해서이 클래스의 크기 등을 비교할 수 있지만 의존성이 더 많은 것, 특히 관리되지 않는 것들 (모두 기본 win32 함수를 사용함)이 있습니다.

RegisterWaitForSingleObject으로 전달 된 대기 핸들에 대해서는 하나의 Maunal/AutoResetEvent를 할당하고 모든 호출에 전달할 수 있습니다 (시간 초과로 계산되므로 어쨌든 신호로 보내지 않을 수 있음) .

성능에 관한 한 확실하지 않습니다. ThreadPool는 RegisterWaitForSingleObject을 통해 등록 된 63 개의 작업마다 특별한 대기 스레드를 사용합니다. 반대로 타이머는 기본 win32 타이머를 사용합니다. 둘 다 실제 실행을 위해 ThreadPool 작업자 스레드를 사용하여 종료됩니다. 어떤 시나리오가 더 좋은가? 내가 낫지 .. 그래서 나는이 일에 스키너와 함께 가고 싶어요 :)

항목 : 나는 동의하지 않는다

+0

블로그 기사의 사용법을 잘 비교하지만 다른 하나를 선호하는 것은 매우 강력하지는 않습니다. 그리고 그것에 대해 더 많이 생각할수록, 커널 전환 등의 관점에서 차이를 볼 수 없었습니다. 나는 여전히 기본 Win32 API에 비용 차이가 있었는지 알고 싶지만 .NET 구현의 '가중치'는 내가 찾은 최고의 대답처럼 보입니다. – piers7

1

아무 것도 없습니다. 타이머는 스레드를 주기적으로 "찌르다 (poke)"위해 사용됩니다. WaitForSingleObject는 핸들을 기다립니다. 시간 초과가 있으므로 교착 상태에 빠지기보다는 대기를 중지하기로 결정할 수 있습니다. 타임 아웃을 사용하는 경우 타이머를 사용하여 잠금에서 waitforsingle 객체를 분리 할 필요가 없습니다.

리소스 비용은 무시할 수 있습니다. 당신이 가지고있는 코드 상황에 크게 의존하기 때문에 어떤 접근법을 사용해야하는지는 알 수 없습니다.

+2

. 그것은 간단한 질문입니다 : 타이머를 할당하는 비용과 waithandle과 WaitForSingleObject를 할당하는 비용. 둘 다 OS 리소스입니다. 하나는 내 상황에 관계없이 다른 것보다 더 많은 비용을 지불해야합니다. 그리고이 시나리오에서는 '일회용'타이머에 대해 이야기하고 있습니다. * 두 가지 모두 주기적으로 코드를 찌르는 데 사용할 수 있습니다. RegisterWaitForSingleObject에서 'executeOnlyOnce'플래그를 사용할 수 있습니다 ... – piers7