2010-05-14 7 views
3

나는 꽤 전형적인 문제라고 생각되는 것을 생각해 냈습니다. 나는 서비스를 운영하고 10 분마다 뭔가해야한다. 나는 다음과 결국 한 : 내가 볼 수반복 실행을 처리하는 방법?

private AutoResetEvent autoResetEvent = new AutoResetEvent(true); 
private bool isRunning = true; 

public void Execute() 
{ 
    while(isRunning) 
    { 
     DoSomething(); 

     if(isRunning) 
     { 
     autoResetEvent.WaitOne(new Timespan(0, 10, 0)); 
     } 
    } 
} 

public void Stop() 
{ 
    isRunning = false; 
    autoResetEvent.Set(); 
} 

즉각적인 잠재적 인 문제 나 다른 스레드하지만 난에 의해 호출되는 정지()에서 isRunning는 수정 주위에 잠금 어떤 종류의 일을하고 있지 않다이다 내가 정말로 해야할지 모르겠다? 내가 생각할 수있는 최악의 상황은 그것이 하나의 추가 사이클을 실행한다는 것입니다.

그 외에도이 코드에 명백한 문제가 있습니까? 내가 모르는이 문제를 해결할 더 좋은 방법이 있습니까?

+0

'while' 내부에'if'가 중복되지 않습니까? – Kelsey

+0

좋은 캐치. 그것은 실제로 지금 고정되어있는 나의 예에서 실수입니다. DoSomething 호출은 실제로 if의 외부에서 발생합니다. DoSomething에 잠시 시간이 걸릴 수 있으므로 잠을 자기 전에 아직 실행 중인지 확인해야합니다. –

답변

7

당신은이 System.Threading.Timer 사용하여 시도해 볼 수도 있습니다 : 어떤 Windows 워크 플로 파운데이션을 사용하는 방법에 대한

Timer tmr = new Timer(DoSomething, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 10, 0)) 
+0

AutoResetEvent와 비교하면 어떤 이점이 있습니까? –

+0

AutoResetEvent와 지루한 로직이 제거되었습니다. 또한 DoSomething은 자체 ThreadPool 스레드에서 실행됩니다. –

+0

루프를 실행하는 대신 타이머가 DoSomething()을 직접 호출합니다. stop() 메소드에서 타이머를 중지하기 만하면됩니다. –

0

더 좋은 방법 중 하나는 Windows Server AppFabric과 같은 기능을 사용하는 것입니다. 반복적 인 작업, 오류 처리 및 관리 기능이 포함되어 있습니다. 필요한 실제 코드를 작성하기 만하면됩니다. 불행히도, 그것은 오늘 최첨단 출혈이지만, 내가 이런 종류의 새로운 개발을 위해 선택할 것입니다.

+0

매우 멋지지만 불행히도 현재 Windows XP SP 2를 사용하고 있습니다. 나는 실제로 TopShelf를 사용하여 멋지지만 반복되는 일을하지 않는 서비스 측면을 관리하고 있습니다. –

+0

[그들은 정말로 업그레이드해야합니다.] (http://support.microsoft.com/gp/lifean31) –

0

를? 나는 그 종류의 일에 상당히 집중하고 있다고 생각합니다.

프로그램을 통해 앱 실행 시간을 시작한 다음 WWF 앱에서 처리하도록 할 수 있습니다.

+0

워크 플로우 파운데이션 (Workflow Foundation)은 이러한 단순한 문제에 대해 과도한 잔인 함으로 보입니다. 나는 또한 전체 v4가 다시 작성한 후에 사용하는 것을 신경 쓰고있다. –

1

10 분마다 실행되지 않습니다. DoSomething이 빠른 프로세스 인 경우 10 분마다 매우 근접합니다. 다음 실행은 DoSomething 완료 후 10 분 후에 실행됩니다.

Quartz.Net과 같은 작업 스케줄러를 사용할 수 있습니다.

+0

좋은 지적. 네, 실제로는 우리가하고 싶은 일이지만 그것을 지적 해 주셔서 감사합니다. –

관련 문제