문제

제네 라코 디스 태그 코드를 사용해야하는 앱을 작성 중이지만 잠재적으로 매우 많이 사용할 수 있습니다.Timer 클래스는 얼마나 확장 가능합니까?문서는 단지 "경량"이라고 말하지만 더 이상 설명하지 않습니다.이러한 타이머가 System.Threading.Timer를 대신하여 모든 콜백을 처리하는 단일 스레드 (또는 매우 작은 스레드 풀)로 빨려 들어가거나 각 Timer에 자체 스레드가 있습니까?

질문을 다시 표현하는 또 다른 방법은 다음과 같습니다. Timer는 어떻게 구현 되나요?

도움이 되었습니까?

해결책

많은 질문에 대한 답변으로 이렇게 말합니다. 프레임 워크에 대한 (관리되는) 소스 코드를 사용할 수 있다는 것을 잊지 마십시오. 이 도구를 사용하여 모든 것을 얻을 수 있습니다. http://www.codeplex.com/NetMassDownloader

안타깝게도이 특정 경우에는 대부분의 구현이 네이티브 코드로 이루어 지므로 볼 수 없습니다 ...

그들은 확실히 타이머 당 스레드보다는 풀 스레드를 사용합니다.

대규모 타이머 모음을 구현하는 표준 방법 (커널이 내부적으로 수행하는 방식이며, 대규모 Timers 모음이 끝나는 방식이 간접적으로 의심되는 방식 임)은 만료 될 때까지 시간별로 정렬 된 목록을 유지하는 것입니다. -따라서 시스템은 전체 목록이 아니라 만료 될 다음 타이머를 확인하는 것에 대해서만 걱정하면됩니다.

대략, 이것은 타이머 시작을위한 O (log n)와 실행중인 타이머를 처리하기위한 O (1)을 제공합니다.

편집 : 방금 Jeff Richter의 책을보고있었습니다. 그는 (Threading.Timer의) 모든 Timer 객체에 대해 단일 스레드를 사용한다고 말합니다.이 스레드는 다음 타이머 (즉, 위와 같이)가 언제 만료되는지 알고 적절한 콜백에 대해 ThreadPool.QueueUserWorkItem을 호출합니다. 이는 다음 시간이되기 전에 타이머에서 하나의 콜백 서비스를 완료하지 않으면 콜백이 다른 풀 스레드에 다시 들어가는 효과가 있습니다. 요약하면 많은 타이머를 사용하는 데 큰 문제가있을 것 같지는 않지만 많은 수의 타이머가 동일한 타이머에서 실행되고 / 또는 콜백이 느리게 실행되는 경우 스레드 풀 소모가 발생할 수 있습니다.

다른 팁

디자인을 다시 생각하고 싶을 것 같습니다 (즉, 디자인을 직접 제어 할 수있는 경우).타이머를 너무 많이 사용하고있어 이것이 실제로 문제가되는 경우 분명히 통합 가능성이 있습니다.

다음은 사용 가능한 세 가지 타이머 클래스를 비교하고 구현에 대한 통찰력을 제공하는 몇 년 전 MSDN Magazine의 좋은 기사입니다.

http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

<인용구>

통합하세요.타이머 만들기 서비스하고 타이머를 요청하십시오. 1 개만 활성화하면됩니다. 타이머 (다음 통화 용) ...

이것이 단지 많은 Threading.Timer 객체를 생성하는 것보다 개선되기 위해서는 이것이 Threading.Timer가 이미 내부적으로하고있는 것과 정확히 다르다고 가정해야합니다.어떻게 그 결론에 도달했는지 알고 싶습니다 (프레임 워크의 기본 부분을 분해하지 않았으므로 옳을 수 있습니다).

^^ DannySmurf가 말했듯이 : 통합하십시오.타이머 서비스를 만들고 타이머를 요청하십시오.1 개의 활성 타이머 (다음 기한 호출을 위해)와 모든 타이머 요청 내역을 유지하고 AddTimer () / RemoveTimer ()에서이를 다시 계산하면됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top