2017-12-28 4 views
0

C# Windows 서비스가 있습니다.C# Windows 서비스에 대한 OnRestart() 이벤트 리스너가 있습니까? Windows 서비스가 다시 시작되었는지 어떻게 알 수 있습니까?

protected override void OnStart(string[] args) 
{  
    string url = "http://localhost:8080"; 
    SignalR = WebApp.Start(url); 
    eventLog1.WriteEntry("Server running on " + url); 
} 

protected override void OnStop() 
{ 
    eventLog1.WriteEntry(LogMessage.Message); 
    SignalR.Dispose(); 
} 

문제는 내 서비스 코드가 그 작업을 실행, 나는 속성이 다시 시작하도록 내 서비스에 설정 완료되면 나는

Environment.Exit(1);

을 수행하고 있다는 점이다 나는 다음과 같은 이벤트가 1 분 후 (장애가 발생한 경우). 그것이 실패 할 때 실제로 "정지"이벤트에 부딪치지 않아서 내 로그가 기록되지 않는 것 같습니다. 그런

OnRestart()

이벤트 또는 뭔가가 있나요? 서비스를 종료하기 전에 로그를 작성하는 방법을 알아 내려고 노력 중입니다. Windows의 서비스 대화 상자에서 "서비스 중지"를 수동으로 클릭하면 일반적으로 로그가 기록됩니다. 하지만 더 이상 서비스를 종료하기 위해 수동으로 중지를 클릭하지 않고 자동으로 서비스를 다시 시작하고 서비스에 오류를 발생시켜 수동으로 중지했다가 다시 시작하지 않아도됩니다.

당신은 내가 그냥 코드를 종료하기 전에

eventLog1.WriteEntry("blah blah"); 

을 할 수있을 것이라고 생각하지만 그것은 범위 밖이고 있기 때문에 내가 별도의 클래스에 코드를 종료하고있어 수 없습니다 :(

+1

Environment.Exit() 서비스의 근본적으로 잘못된 것입니다. 언제 중단해야하는지 결정하는 것은 서비스 관리자입니다. 타이머를 사용하여 1 분 1 회 작업을 구현하십시오. –

+0

더 이상 Windows 서비스를 작성하지 않습니다. 콘솔 응용 프로그램을 작성하고 [ "TopShelf"] (http://docs.topshelf-project.com/en/latest/configuration/quickstart.html)에서이를 Windows 서비스로 실행합니다. 시작시, 중지시, 예외시, 그리고 다른 것들도 지정할 수 있습니다 - 기본 서비스는 10 행의 코드 만 필요합니다. –

+0

@HansPassant 잘못된 의견은 ** ** 사실이 아닙니다. – Yusha

답변

0

이 어떤 이유로 실패하면 당신은? 일을하고있는 코드의 섹션 주위에 try/catch 블록을 포장 할 수 없습니다, 그것은 당신이를 OnStop() 이벤트를 발생시킬 수 catch 블록에서 이동합니다.

try 
    {    
     //Your service code 
    } 

    catch (Exception e) 
    { 
     OnStop(); 
    } 
+0

* 작동하는 것처럼 보입니다. 나는 그것을 시도 할 것이다. – Yusha

관련 문제