2011-08-10 5 views
5

.Net 4를 사용하여 간단한 Windows 서비스를 구축 할 때 서비스를 시작하기 전에 5 분 지연을 설정하려고 할 때 문제가 발생합니다.Windows 서비스를 시작하기 전에 5 분 지연시키는 방법은 무엇입니까?

protected override void OnStart(string[] args) 
{ 
    // make a 5 min delay 
    // do something 
} 

하지만 몇 초 후에 서비스가 중지되고 시간 초과 오류가 발생합니다 (이벤트 로그에서 확인). 내가 어떻게해야할까요?

+1

왜이 기능을 원하십니까? – TJHeuvel

답변

5

새로운 스레드에서 장기 실행 프로세스를 시작하므로 OnStart 메서드를 차단하지 마십시오. 예 :

using System.Threading; 

protected override void OnStart(string[] args) 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback((_) => 
    { 
     Thread.Sleep(5 * 1000 * 60);//simulate 5 minutes work 

     // do something 
    })); 
} 
+1

예. 좋은 생각. 운영 체제에서 지연된 서비스 시작 옵션을 무시하고 주변에 코드를 입력하십시오. – TomTom

+0

@TomTom :'예. 좋은 생각. 운영 체제에서 지연된 서비스 시작 옵션을 무시한 다음 그 주변에 손수 작성을하십시오. '왜 -1일까요? 당신 실수로 그것을합니까 ?? –

+2

TomTom은 신맛이 있습니다. Windows 2003을 사용하고 있기 때문에 모든 버전의 Windows에서 지연된 서비스 옵션을 지원합니다. –

3

서비스가 요청 될 때 시작해야합니다. OnStart돌아 가기. 빨리.

그렇다면 서비스는 DOES까지 5 분 정도 기다릴 수 있지만 시작주기를 멈출 수는 없습니다.

시작한 다음 작업자 스레드가 작업을 수행 할 때까지 기다립니다.

즉, 지연을 가지고 서비스를 시작할 수있는 구성 항목이 있습니다. 그것은 구성 에 대한 서비스, 훨씬 Manual, Automatic처럼 delayed 항목이 있습니다. 이렇게하면 시스템이 시작될 때까지 기다릴 시간이 거의 없을 때만 서비스가 시작됩니다. 이것은 더 좋을 수도 있고 좋을 수도 있습니다.

+0

구성 항목에 대해 더 자세히 설명 할 수 있습니까? 부디. –

+0

Windows 서비스 구성을 열고 옵션을보고 google을 사용하십시오. 그렇게 어렵지 않아요. 내가 해줄거야. Google "Windows 서비스 시작 지연", 두 번째 항목은 ... http://www.techrepublic.com/blog/datacenter/delayed-start-feature-increases-options-for-windows-services/1552 – TomTom

+0

@TomTom 좋은 해결책이 될 수 있지만 Win7, Vista 및 2008 서버에서만 지원됩니다 ... – Incognito

1

서비스가 시작될 때 응답해야하거나 Windows가 오작동한다고 생각하면 응답해야합니다. 따라서 두 가지 옵션이 있습니다.

  1. 시작시 실행되고 5 분 후에 서비스가 시작되는 별도의 응용 프로그램을 작성하십시오.

  2. 서비스를 시작하고 업무 로직이 무엇이든 시작하기 전에 5 분 지연하십시오. Windows가 정상적으로 시작했다고 생각하는 한 행복합니다. 이 같은

뭔가 :

private static Timer t; 
protected override void OnStart(string[] args) 
{ 
    t = new Timer(5000*60); 
    t.Elapsed += new ElapsedEventHandler(OnTimedEvent) 
    t.Start() 
} 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    // real code here 
} 
2

OnStart 방법 그렇지 않으면 오류가 시간을 얻을 것이다 적시에 반환해야합니다.

당신이해야 할 일은 OnStart에서 스레드를 시작하고 그 스레드에서 서비스를 실제로 시작하기 5 분 전에 기다리는 것입니다. 그래서 OnStart 방법이된다 :

serviceThread = new Thread(new ThreadStart(workerClass.WorkerMethod)); 

serviceThread.Start(); 

그리고 WorkerClass.WorkerMethod는 서비스의 실제 시작을한다.

1

왜 5 분 동안 서비스 시작 루틴을 지연시키고 싶은지 이해가되지 않습니다. 서비스 루틴이 오래 걸리는 경우 서비스 제어 관리자가 모든 작업을 중단하여 서비스를 시작할 수 없습니다. Thread/Timer를 OnStart Method에서 시작하고 Thread/Timer 프로 시저에서 5 분을 기다려야합니다.

protected override void OnStart(string[] args) 
     {    
      Thread processor= new Thread(ThreadProc); 
      processor.Start(); 
     } 

     private void ThreadProc() 
     { 
      while (true) 
      { 
       Thread.Sleep(TimeSpan.FromMinutes(5)); 

      } 
     } 
1

작업을 지연시키기 위해 System.Timers.Timer를 사용하십시오 ...내 서비스 중 일부 코드는 다음과 같습니다. 지연을 사용하는 이유는 온 스타트 이벤트에서 너무 오래 걸리면 서비스가 중단된다고 가정하기 때문입니다. 서비스가 처음 시작될 때 많은 일을했기 때문에 타이머를 만드는 것만으로 서비스를 매우 빠르게 시작한 다음 그 이벤트가 실제 시작 물건을 처리하게합니다.

protected override void OnStart(string[] args) 
    { 
     try 
     { 
      // Using a timer Event to start asynchronously 
      StartupTimer = new Timer(); 
      StartupTimer.Elapsed += StartupTimer_Elapsed; 
      StartupTimer.AutoReset = false; 
      StartupTimer.Interval = 5*60*1000; 
      StartupTimer.Start(); 
     } 
     catch (Exception ex) 
     { 
      LogMessage(true, ex.ToString()); 
     } 
    } 

    private void StartupTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     try 
     { 
      RunSetup(true); 
     } 
     catch (Exception ex) 
     { 
      LogMessage(true, ex.ToString()); 
     } 
    } 
0

직선 전달 방법은, 자세한 내용은 System.Threading.Timer를 참조하십시오이 System.Threading.Timer을 사용하여 5 분으로 인해 시간 설정하는 것입니다.

0

문제의 근본 원인은 서비스가 시작되는 데 시간이 걸리면 Windows가 제대로 작동하지 않는다고 생각하여 죽일 수 있다는 것입니다.

이 서비스를 시작하는 데 시간이 조금 걸릴 것이라고 Windows에 먼저 알려줌으로써이 문제를 해결할 수 있습니다.

이렇게하려면 다음 질문에 대한 답변을 참조하십시오. windows service startup timeout

관련 문제