서비스 시작 (OnStart) 중에 작업자 스레드가 시작되는 경우가 있습니다. 작업자 스레드는 SQL 데이터베이스에 연결합니다. 데이터베이스를 사용할 수없는 경우 작업자 스레드는 실패의 주 스레드에 신호를 보낼 수 있습니다. 질문은 ~이야; 서비스 제어 관리자가 시작에 실패했음을 알리는 방법Service.OnStart에서 신호 초기화 실패
4
A
답변
3
이것은 우리가이 상황을 처리 한 방법입니다. 이 코드는 우리의 주 서비스 클래스에 추가 된 다음 시작 실패를 반환하려는 시점에서 SetServiceFail (1065)을 호출 한 다음 OnStart에서 반환했습니다. 이 경우 1065는 데이터베이스가 존재하지 않는 상태를 반환합니다.
SetServiceFail에서 serviceType을 하드 코딩 했으므로 우리의 모든 서비스가 독립형이므로 serviceType을 하드 코딩 했으므로 간단하게 유지했습니다.
private void SetServiceFail (int ErrorCode)
{
SERVICE_STATUS _ServiceStatus = new SERVICE_STATUS();
_ServiceStatus.currentState = (int) State.SERVICE_STOPPED;
_ServiceStatus.serviceType = 16; //SERVICE_WIN32_OWN_PROCESS
_ServiceStatus.waitHint = 0;
_ServiceStatus.win32ExitCode = ErrorCode;
_ServiceStatus.serviceSpecificExitCode = 0;
_ServiceStatus.checkPoint = 0;
_ServiceStatus.controlsAccepted = 0 |
(this.CanStop ? (int) ControlsAccepted.ACCEPT_STOP : 0) |
(this.CanShutdown ? (int) ControlsAccepted.ACCEPT_SHUTDOWN : 0) |
(this.CanPauseAndContinue ? (int) ControlsAccepted.ACCEPT_PAUSE_CONTINUE : 0) |
(this.CanHandleSessionChangeEvent ? (int) ControlsAccepted.ACCEPT_SESSION_CHANGE : 0) |
(this.CanHandlePowerEvent ? (int) ControlsAccepted.ACCEPT_POWER_EVENT : 0);
SetServiceStatus (this.ServiceHandle, ref _ServiceStatus);
}
public enum State
{
SERVICE_STOPPED = 1,
SERVICE_START_PENDING = 2,
SERVICE_STOP_PENDING = 3,
SERVICE_RUNNING = 4,
SERVICE_CONTINUE_PENDING = 5,
SERVICE_PAUSE_PENDING = 6,
SERVICE_PAUSED = 7
}
public enum ControlsAccepted
{
ACCEPT_STOP = 1,
ACCEPT_PAUSE_CONTINUE = 2,
ACCEPT_SHUTDOWN = 4,
ACCEPT_POWER_EVENT = 64,
ACCEPT_SESSION_CHANGE = 128
}
[StructLayout (LayoutKind.Sequential)]
private struct SERVICE_STATUS
{
public int serviceType;
public int currentState;
public int controlsAccepted;
public int win32ExitCode;
public int serviceSpecificExitCode;
public int checkPoint;
public int waitHint;
}
[DllImport ("advapi32.dll")]
private static extern bool SetServiceStatus (IntPtr hServiceStatus, ref SERVICE_STATUS lpServiceStatus);
0
방법 중 하나는 ServiceController를 사용하는 것입니다 중지,하지만 당신은 늘 오류 또는 시작 실패에 대한 서비스 제어 관리자에있는 멋진 메시지가 표시됩니다.
var controller = new System.ServiceProcess.ServiceController("NameOfYourService");
controller.Stop();
관련 문제
- 1. RESTful API에서 신호 인증 실패
- 2. EDBEngineError- 네트워크 초기화 실패
- 3. Vista에서 BDE 초기화 실패 ($ 2501 오류)
- 4. jboss 4.2.2 작업자 스레드 초기화 실패
- 5. 안드로이드 RTSP - MediaPlayer 초기화 실패/PVMFFailure
- 6. 로깅 성공/실패 봄 컨텍스트 초기화
- 7. 신호 수신 신호 SIGIO
- 8. NSMutableArray를 초기화 할 때 신호 오류 10 개 발생
- 9. AJAX 완료시 신호 방법
- 10. Rails 3 엔진의 보석 의존성이 초기화 프로그램에서 실패 함
- 11. 포크의 신호
- 12. 신호 차단
- 13. Windows상의 신호
- 14. 신호 처리
- 15. 신호 스택
- 16. 신호 NaN의 유용성?
- 17. 실패
- 18. C 배열 초기화
- 19. RS 232 중단 신호
- 20. C++ 연결 신호
- 21. 포크 후 호출 신호
- 22. 장고에 여러 신호 등록
- 23. GtkNoteBook 신호 처리 문제
- 24. 유닉스에서 신호 처리의 차이점
- 25. GPS 신호 강도 찾기
- 26. 웨이크 온 신호 On
- 27. QT 신호 슬롯 질문
- 28. Pylons의 신호 처리
- 29. 신호 QT, QueuedConnection
- 30. 스레드 신호 기초