2011-02-27 4 views
1

구성에 따라 몇 가지 작업을 시작하는 Windows 서비스가 있습니다.스레드 시간 초과 또는 Thread.Sleep()이 오랫동안 스레드를 닫거나 중단합니까?

각 작업은 자체 스레드에서 시작하며 일부 작업은 하루에 한 번 실행됩니다.

나는 Thread.Sleep()을 사용하고 다음 실행 시간을 계산합니다.

문제는 2 ~ 3 일 후에도 서비스가 계속 실행되고 있지만 일부 작업은 실행되지 않습니다.

잠 기간이 맞으면 모든 것이 잘 작동하고 예외가 발생하지 않습니다.

스레드를 중지 시키거나 수면 방법이 스레드를 중단시킬 수있는 것이 있습니까?

이 스레드

private void TaskLifeCycle() 
    { 
     try 
     { 
      // Create task object. 
      Type taskType = Type.GetType(this.ConfigurationElement.Task); 
      DebtLogic.Service.BackgroundTask bgTask = Activator.CreateInstance(taskType) as BackgroundTask; 
      bgTask.Context = this; 
      FireEvent(CreatedEventKey, new BackgroundTaskEventArgs(bgTask)); 
      FireEvent(InitilizingEventKey, new BackgroundTaskEventArgs(bgTask)); 
      bgTask.Initilize(); 
      FireEvent(InitilizedEventKey, new BackgroundTaskEventArgs(bgTask)); 
       // while the thread is alive, and did not abort then run. 
      while (this.CurrentThread.IsAlive) 
      { 
       try 
       { 
        //can run then block 
        if (CanRun(bgTask)) 
        { 
         Run(bgTask); 
        } 
       } 
       catch (ThreadAbortException) 
       { 
        return; 
       } 
       catch (Exception ex) 
       { 
        FireEvent(ErrorEventKey,new BackgroundTaskErrorArgs(ex)); 
       } 
      } 
      bgTask.Dispose(); 
     } 
     catch (ThreadAbortException) 
     { 
      return; 
     } 
     catch (Exception ex) 
     { 
      FireEvent(ErrorEventKey, new BackgroundTaskErrorArgs(ex)); 
     } 
    } 
private bool CanRun(BackgroundTask bgTask) 
    { 
     if (this.ConfigurationElement.EventBasedTask) 
     { 
      return bgTask.CanRun(); 
     } 
     TimeSpan time; 
     if (this.ConfigurationElement.Time != TimeSpan.Zero) 
     { 
      time = this.ConfigurationElement.Time - DateTime.Now.TimeOfDay; 
      if (time.TotalMilliseconds < 0) 
       time = time.Add(new TimeSpan(24, 0, 0)); 
     } 
     else 
     { 
      time = new TimeSpan(0, 0, this.ConfigurationElement.Interval); 
     } 
     Thread.Sleep(time); 
     return bgTask.CanRun(); 
    } 

실행의 주요 기능과 초기화 방법은 내가 OS는 긴 수면을 할 수 있는지 확실하지 않습니다 작업

+0

스레드 시작과 예외 처리를 포함하여 스레드 워커의 기본 구현을 보여주는 코드를 공유하면 질문에 대한 답이 생길 수 있습니다. 지금 남은 유일한 일은 추측입니다. – rene

+1

절전 모드를 사용하는 것과 같은 긴 '잠들'을 잘 다룰 수 없을 것 같습니다. 잠깐이라도 잠들지 않을 것입니다. – CodesInChaos

답변

1

오랫동안 잠자기 상태 인 스레드가있는 대신. 매우 짧은 시간 (1 분) 동안 잠들고 마지막 실행 후 충분한 시간이 경과했는지 확인 할 때마다 짧은 스레드를 만듭니다. 이것은 훨씬 강력하고 시스템이 '아직 살아 있는지'를 추적 할 수 있습니다.

+0

thx 너무 많이, 나는 1 분으로 시간 제한을 변경했습니다, 그리고 그것을 잘 작동 확인하십시오. duuno 문제는 무엇 이었지만 지금은 작동 중입니다. –

0

를 호출하는 추상 메소드입니다. 디자인을 변경해야 할 수도 있습니다. Sleep 스레드는 적어도 1MB의 RAM을 소비합니다 (상황에 따라).

System.Threading.Timer을 사용해 보거나 요구 사항에 따라 자신의 일정 클래스를 구현하십시오.

관련 문제