2010-07-25 3 views
1

저는 매 60 초마다 조치를 취해야하는 Windows 서비스를 작성하고 있습니다.Windows 서비스에서 X 분마다 동작을 수행하기위한 효율적인 루프를 만드는 방법은 무엇입니까?

메인 루프를 구현하는 가장 좋은 방법은 무엇입니까?
1)가 ManualResetEvents를 사용하여 모든 XX 초
2)은 (내가 본 구현 한 번만 실행하는 대리자를 실행하는 타이머 개체를 사용하지만, 같은 :

구현 지금까지 본 적이 지금까지 이해할 수 있듯이 이러한 리셋 이벤트가있는 루프를 만들 수 있습니다.

Windows 서비스는 항상 실행되므로 메모리 누수가없는 서비스를 만드는 것이 가장 좋습니다.

메인 루프를 구현하는 가장 좋은 방법은 무엇입니까?

주석 뒤에 편집 : X 초마다 수행 할 작업은 여러 스레드 (최대 10 개까지 허용)를 시작합니다. 각 스레드가 30 초 이상 실행되지 않습니다.

+0

얼마나 정밀도를 찾고 계십니까? 한 번의 반복 작업이 예상보다 오래 걸리면 다음 반복 작업을 시작해야합니까? – ChaosPandion

+0

나는 내 질문을 편집했습니다 – citronas

답변

3

타이머를 사용하십시오. 이것은 프로그램의 의도를 가장 분명하게 만듭니다. OnStart 및 OnStop 메서드에서 타이머를 시작하고 중지하는 것은 간단하며 콜백은 스레드 풀에서 실행되므로 스레드를 묶지 않습니다. Timer 객체는 메모리 자체를 누출하지 않습니다. (메모리를 누출시키는 버그를 작성할 수는 있지만, 메인 루프의 구현으로도 똑같이 간단합니다.)

1

xx 초보다 오래 걸리지 않을 가능성이 없다면 타이머와. 그렇지 않다면 ManualResetEvents를 사용할 것입니다. 나는 하나 이상의 액션이 동시에 실행되기를 원하지 않는다고 가정합니다.

+0

한 번에 여러 가지 작업을 실행하는 것에 관한 질문에 대한 답변을 얻으려고 내 질문을 편집했습니다. – citronas

3

Quartz.net 사용을 고려 전체 예입니다. 이 라이브러리를 사용하고있어 매우 만족합니다. 당신은 당신의 요구에 맞는 맞춤 cron 일정을 설정할 수 있습니다.

1

여기는 또 하나의 일반적인 패턴으로 ManualResetEvent을 중지 및 조절 메커니즘으로 사용합니다.

public class Example 
{ 
    private Thread m_Thread; 
    private ManualResetEvent m_StopSignal = new ManualResetEvent(false); 

    public void Start() 
    { 
    m_Thread = new Thread(Run); 
    m_Thread.Start(); 
    } 

    public void Stop() 
    { 
    m_StopSignal.Set(); 
    if (!m_Thread.Join(MAX_WAIT_TIME)) 
    { 
     m_Thread.Abort() // Abort as a last resort. 
    } 
    } 

    private void Run() 
    { 
    while (!m_StopSignal.WaitOne(YOUR_INTERVAL)) 
    { 
     // Your task goes here. 
    } 
    } 
} 
+0

'while (! m_StopSignal.WaitOne (YOUR_INTERVAL)) '이라고해야합니다. –

+0

감사합니다. 수정되었습니다. –

관련 문제