Service起動(OnStart)中にワーカースレッドが開始されるケースがあります。ワーカースレッドはSQLデータベースに接続します。データベースが使用できない場合、ワーカースレッドは、メインスレッドに失敗の旨を伝えることができます。質問は;起動が失敗したことをService Control Managerに通知する方法。Service.OnStartからのシグナリング初期化エラー
4
A
答えて
3
これが私たちがこの状況をどのように処理したかです。このコードはメインのサービスクラスに追加され、起動が失敗した場合はSetServiceFail(1065)が呼び出され、その後OnStartからの戻りが返されました。この場合、1065はデータベースが存在しない状態を返します。
私はSetServiceFailで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を使用することを止める1つの方法は、サービスコントロールマネージャーでエラーまたは開始の失敗についてのメッセージを得ることがありません。
var controller = new System.ServiceProcess.ServiceController("NameOfYourService");
controller.Stop();
関連する問題
- 1. 初期化エラー
- 2. AVAudioPlayer初期化エラー
- 3. YouTube初期化エラー
- 4. PowerMockRunner初期化エラー
- 5. Twilio:AndroidのエラーTwilioConversations [シグナリング]
- 6. ASP.NETコアのDIで初期化オブジェクトからオブジェクトを初期化
- 7. 春ブートデータソースの初期化エラー
- 8. メディアキャプチャの初期化エラー
- 9. Glassfish:EJBコンテナの初期化エラー
- 10. 初期化時のPayPalエラー
- 11. ERROR SparkContext:SparkContextの初期化エラー
- 12. as_paperclip_bridge rails3の初期化エラー
- 13. SparkContext初期化エラー:Scalaの
- 14. アンドロイド・ウィジェットの初期化エラー
- 15. STリンクデバイスの初期化エラー
- 16. リンクリストクラスの初期化エラー
- 17. エラーC2440: '初期化': 'ダブル* []'
- 18. d3.js初期化エラーIE11
- 19. C++ 11クラス初期化エラー
- 20. 未初期化定数...エラー
- 21. ユニティIAP初期化エラー
- 22. .Net Frameworks初期化エラー
- 23. AWSラムダモジュール初期化エラー
- 24. 「無効な初期化」エラー
- 25. 初期化されたエラー
- 26. Intellij Springプラグイン初期化エラー
- 27. java.lang.NoClassDefFoundError:org.apache.jasper.el.ELContextImpl(初期化エラー)
- 28. Log4j初期化エラーJBoss RestEasy
- 29. 作曲初期化エラー
- 30. Test2配列初期化エラー