2012-05-10 2 views
1

창 서비스를 작성하고 있습니다. 하루에 한 번 실행해야 할 작업이 있습니다. 일부 작업 세트는 5 분이라는 시간 간격 후에 실행되어야합니다. 마지막으로 72 시간을 말하면 일정한 작업이 실행되어야합니다.창 서비스를위한 다른 종류의 작업을위한 완벽한 다중 스레드 모델 만들기

한편 나는 어떤 설정을 특정 시간 간격으로 새로 고침해야합니다.

제대로 설계 할 때 조금 문제가 있습니다. 이것은 그것을위한 나의 디자인이다.

public void StartController() 
     { 
      try 
      {    
       readSettings();     
       startDetectionAndPost(); //once a day 
       LogUtil.WriteLog(LogLevel.INFO, "starting bootstrap"); 
       bootStrap(); //based on time interval elapsed 
       LogUtil.WriteLog(LogLevel.INFO, "starting heartbeat of agent"); 
       startHeartBeat(); //after a time interval say 1 min     
       LogUtil.WriteLog(LogLevel.INFO, "start fetching ADSI info"); 
       startInfoTimer(); 

       while (true) 
       { 
        if (!IsRunning) 
        { 
         engine.StopExecution();      
         break; 
        } 
        //here got to change this as per threading model. 
        while (_threadMonitor.CurrentThreadCount >= MAX_JOB_COUNT) 
        { 
         if (!IsRunning) 
         { 
          engine.StopExecution(); 
          LogUtil.WriteLog(LogLevel.INFO, "query execution stopped");        
          break; 
         } 
         //otherwise sleep 
         Thread.Sleep(100);       
        } 

        _executionThread = new Thread(new ThreadStart(engine.StartExecution)); 
        _threadMonitor.IncrementThread(); 
        _executionThread.Start(); 

        //if user gone stop service it will timeout issue. 
        Thread.Sleep(new TimeSpan(0, 0, 1));//_agentCache.DomainSweepInterval)); 
       } 
      } 
      catch (Exception ex) 
      { 
       LogUtil.WriteLog(LogLevel.ERROR, "could not process."+ex.Message,ex); 
       //log exception and what to do next. 
      } 
     } 

하루에 한 번 수행해야하거나 매분마다 하트 비트를 수행해야합니다. 이 타이머는 다른 타이머와 독립적이므로 타이머를 생성하고 시작했습니다. 그런데 주요 실행 부분. 어디 두 가지 유형의 쿼리를 실행할 수 있습니다. 1) 매 간격 후 5 분마다 그리고 다른 간격은 매 72 시간마다 말하십시오. 한 번에 한 번만 실행할 수 있습니다. 2) 나는 5 분 후에 다른 설정을 새로 고쳐야하는데 시간 간격을두고 설정을 새로 고쳐야한다. 30 분 후 한 번, 다른 후 60 분 후에 다시 말해야한다.

이제 서비스를 시작/중지하지 않고 모든 것이 확장 성 및 성능에 맞게 완벽하게 설계되어야 제대로 정렬하는 데 어려움이 있습니까?

의견을 공유해주세요. 제 질문이 올바르게 짜 넣어지기를 바랍니다.

감사합니다.

+7

일정에 따라 실행해야하는 작업이있는 경우 Windows Task Scheduler에서 다시 실행하지 말고 실행하십시오. 명령 줄 매개 변수를 사용하여 적절한 작업을 수행하는 "표준"실행 파일을 만든 다음 실행 파일을 호출하여 해당 작업을 수행하도록 예약 된 작업을 만듭니다. Windows 서비스는 현재 수행중인 작업에 적합하지 않습니다. – Rob

+0

저는 개인적으로 선호하지 않습니다. 제 경우의 일정 시간이 계속 변할 수 있기 때문입니다. 한 고객의 경우 72 시간이고 다른 고객의 경우 1 시간이 될 수 있다고 말합니다. 여기서 모든 것은 동적이며 서버에서 제어됩니다. – sunder

+4

이 경우 Windows 예약 된 작업을 관리하는 도구를 만듭니다. 일정 수정 UI가 잘못된 작업을 제거하고 새 작업을 추가하고 기존 작업을 업데이트하십시오. Windows 스케줄러와 동일한 작업을 수행하는 Windows 서비스를 작성하는 것은 ** 어렵습니다 ** 더 많은 것을 요합니다. * Microsoft는 이미 귀하에게 적합합니다 *. 이미 사용 가능한 것을 활용하십시오 =) 서비스를 만드는 데 중점을 두는 경우, 잠자기 상태 인 스레드를 사용하지 말고 타이머를 사용하여 필요한 시간에 이벤트를 발생 시키십시오. 필요한 시간마다 "활동"에 적절한 코드를 실행하여 반응합니다. 행하다. – Rob

답변

0

먼저 Task Scheduler에 문제가 있음을 동의합니다. 나는 이것들 중 하나를 먼저 써야했지만 처음부터이 프로젝트를 보았습니다.

http://taskschedulerengine.codeplex.com/

이것은 당신이 다른 개발자의 뒷면에 등반하고 실제 비즈니스 문제에 집중할 수 있습니다. 또한 추가하고 싶은 것을 찾으면 커뮤니티에 돌려 줄 수 있습니다.

+0

나는이 문제를 직접 해결했지만, 여전히 전문가들을 찾아 그들의 의견을 제시 할 것이다. 나는 나중에 내 코드를 게시 할 것이다. – sunder

관련 문제