2011-04-28 2 views
0

installutil.exe와 함께 설치 한 .NET 2.0 Windows 서비스가 있습니다. 이 서비스의 기능은 입력 파일을 탐색하고 각 레코드를 처리하고 출력 파일을 저장하는 일괄 처리 서비스입니다. Windows 서비스에서 서비스를 시작하면 20 초 후에 서비스가 응답하지 않는다고 표시되어 서비스를 중지하지만 출력 파일에서 서비스가 정상적으로 실행되고 있음을 확인할 수 있습니다. 받은 정확한 메시지는 다음과 같습니다. 오류 1053 : 서비스가 시작 또는 제어 요청에 적시에 응답하지 않았습니다..NET Windows 서비스가 실행 중임에도 불구하고 응답하지 않음

레지스트리 해킹으로 Windows 서비스 시간 초과가 증가했지만 동일한 결과가 나타납니다. "응답하지 않음"메시지를 수신하는 데 시간이 더 걸리는 유일한 차이점이 있습니다.

내 서비스의 ONSTART 방법은 다음과 같습니다

protected override void OnStart(string[] args) 
{ 
    Producer producer = new Producer(); 
    ThreadStart st = new ThreadStart(producer.Produce); 
    workerThread = new Thread(st); 
    workerThread.Start(); 
} 

static void Main() 
{ 
    System.ServiceProcess.ServiceBase[] ServicesToRun; 
    ServicesToRun = new System.ServiceProcess.ServiceBase[] { new BatchService() }; 
    System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
} 

생산자 생성자 : 나는 Windows 서비스의 작업을 알리기 위해해야 ​​할 일이

public Producer() 
{ 
    nMaxConcurentJobs = int.Parse(ConfigurationManager.AppSettings["MaxConcurentJobs"]); 
    if (ConfigurationManager.AppSettings[TIME_INTERVAL] != null)` 
    { 
      sleepTime = int.Parse(ConfigurationManager.AppSettings[TIME_INTERVAL]); 
      sleepTime *= 1000; 
    } 
} 

있습니까? 어떤 도움이라도 인정 될 것입니다, 저는 며칠 동안 이것을 고심하고 있습니다!

+0

'메인'과 '프로듀서'생성자를 게시 할 수 있습니까? – Brook

+0

내가 게시했습니다 .. – Alex

+0

범인이 보이지 않습니다. @Steve Townsend가 제안한대로 'BatchService'에 대한 생성자를 게시하는 것이 좋습니다. 그것이 없어야 만하는 곳에서 무거운 짐을 짊어지고 있습니다. 그냥 찾아야합니다. – Brook

답변

1

OnStart이 일종의 로그 출력을하도록하여 확인하십시오.

ServiceBase -derived 클래스 생성자에서 많은 작업을 수행하지 않고 있는지 확인하십시오. OnStart은 무거운 작업을 수행 할 곳입니다.

시작 논리가 오래 지속된다면 프로세스 제어가 실패한 것으로 가정하여 서비스 제어 관리자 (SCM)를 막기 위해 RequestAdditionalTime에 전화해야 할 수 있습니다. OnStart에서 돌아 오면 서비스 GUI에서 SCM이 서비스를 '실행 중'으로 표시합니다.

서비스가 아닌 상태로 실행하여 멀티 스레드 시작 코드에서 교착 상태가 발생하지 않도록 응용 프로그램을 디자인하십시오. 해당 진단 출력을 논리에 추가하여 진행 상황을 추적하십시오.

+0

나는 로그 파일을 가지고 있으며 모든 것이 올바르게 작동하고 있음을 보여줍니다. OnStart 메서드를 게시했는데 볼 수 있듯이 새로운 스레드를 만드는 것이 전부입니다. – Alex

0

Producer.Produce()에 대한 세부 정보는 어디에도 없지만 sleepTime 회원 인 것 같습니다. Thread.Sleep()을 사용하고 있습니까? 그렇다면 대신 Monitor 또는 Timer을 사용해 보셨습니까?

관련 문제