2010-06-23 6 views
6

나는 만료 및 전자 메일 알림 등을 수행하기 위해 System.Timers.Timer 개체를 사용하는 응용 프로그램을 보유하고 있습니다. 현재 시스템에는 한 번에 몇 백 개의 타이머가 있지만, 앱의 사용을 확장 할 예정이며 그 수는 수천 (아마도 10,000 개를 넘지 않음)으로 확대 될 수 있습니다.몇 개의 System.Timers.Timer 인스턴스를 만들 수 있습니까? 얼마나 확장 할 수 있습니까?

타이머 수를 늘리는 데 필요한 정보를 찾을 수 없으므로 문제가되지 않을 것으로 생각됩니다. 이것이 문제가 될 것이라는 것을 아는 사람이 있습니까? 만료를 처리하는 방식을 적극적으로 변경해야합니까?

+0

Threading.Timer에 관한 비슷한 질문이 있습니다. – GregC

+1

@GregC, 그 답변을 확인할 수 있도록 링크를 게시 할 수 있습니까? – tster

답변

11

약간에 문제를 제기하지만. . .

System.Timers.TimerSystem.Threading.Timer 래퍼이며, 차례로 Windows 'Timer Queues 주위의 .NET 래퍼입니다. 타이머 대기열 타이머는 매우 가볍습니다. 시스템 자원을 거의 사용하지 않습니다. 수천 개의 타이머로 확장하지는 않았지만 수백 개의 타이머가 정상적으로 작동합니다. 구현을 수집 할 수 있었던 것에서부터 수천 명의 타이머에 문제가있을 것이라고 상상할 수 없습니다.

특정 타이머 대기열에있을 수있는 타이머의 수에는 제한이있을 수 있습니다. 나는 그 한계가 무엇인지 모른다. 이 타이머를 1 년 전에 조사했을 때 .NET Framework가 프로세스 당 하나의 타이머 대기열을 만들었거나 (또는 ​​앱 도메인 당 하나의 타이머 대기열을 만들었습니다.) 생성 한 모든 타이머가 하나의 대기열에 들어갑니다.

단일 타이머 및 우선 호출 대기열 메커니즘을 사용하여 다음에 호출되는 것을 제어하는 ​​자체 시스템을 생성하여 타이머 대기열 기능을 복제하는 것이 적절하지 않을 수 있습니다. 그게 바로 타이머 큐가하는 일입니다.

10,000 개의 타이머를 만드는 테스트 프로그램을 쉽게 만들 수있는 것 같습니다. 각 항목을 마지막 이후 1 초 동안 체크하고 해당 기간을 10,000 초로 설정하십시오. 그런 다음 앉아서 진드기를 지켜보십시오. 또는 프로그램에서 다음에 누가 체크하고 다음에 실제로 틱해야 하는지를 추적하게하십시오.

0

타이머를 하나만 사용하는 것은 어떻습니까? 타이머는 첫 번째 만료시에 만료되고 만료시 적절한 로직을 수행합니다. 그런 다음 다음 만료까지 간격을 재설정 하시겠습니까? 하나의 타이머 만 사용하여 만료를 처리하는 또 다른 방법 일 수 있습니다.

+2

분명히 타이머를 많이 사용하지 않는 방법은 여러 가지가 있습니다. 그러나 코드를 변경하는 것이 가치가 있는지 궁금합니다. – tster

0

관심이 있으시면 시스템 클래스의 Reflector를 사용하여 타이머 클래스가 사용하는 기본 OS 리소스를 살펴보십시오.

그럼 나도 알아, 늦게에 마크 러시 노 비치 http://blogs.technet.com/b/markrussinovich/

0

많은 것을 사용하면 문제가 없습니다. 그러나 pdiddy와 마찬가지로, 가능하다면 코드를 변경하는 것이 좋습니다. 1 대 10.000 타이머가 차이를 만듭니다. ;-)

관련 문제