サービスの起動(OnStart)中にワーカースレッドが開始される場合があります。ワーカースレッドはSQLデータベースに接続します。データベースが利用できない場合、ワーカースレッドはメインスレッドに障害を通知できます。質問は; スタートアップが失敗したことをサービスコントロールマネージャーに通知する方法。
2316 次
2 に答える
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);
于 2009-03-20T18:04:23.960 に答える
0
これを停止する 1 つの方法は、ServiceController を使用することですが、サービス コントロール マネージャーに、エラーや起動の失敗に関する派手なメッセージが表示されることはありません。
var controller = new System.ServiceProcess.ServiceController("NameOfYourService");
controller.Stop();
于 2009-03-20T18:30:07.860 に答える