次の方法で共有


マルチスレッド サービス

サービス コントロール マネージャー (SCM) は、サービスコントロールイベントをサービスのコントロールハンドラルーチンに送信することによってサービスを制御します。 サービスは、SCM がサービスの状態を追跡できるように、適切なタイミングで制御イベントに応答する必要があります。 また、サービスの状態は、SCM が受け取る状態の説明と一致する必要があります。

サービスと SCM の間のこの通信メカニズムのため、サービスで複数のスレッドを使用する場合は注意する必要があります。 サービスが SCM によって停止するように指示された場合、サービスが停止したことを SCM に報告する前に、すべてのスレッドが終了するまで待機する必要があります。 そうしないと、SCM がサービスの状態について混乱し、正しくシャットダウンできない可能性があります。

SCM には、サービスが停止制御イベントに応答していること、およびサービスの停止中に進行状況が行われていることを通知する必要があります。 SCM は、SetServiceStatusの前回の呼び出しで指定された時間内 (待機ヒント) 内でサービスが (SetServiceStatusを介して) 応答し、SetServiceStatus に対する前の呼び出しで指定されたチェックポイントより大きい値にチェック ポイントが更新された場合に、サービスが進行していることを前提とします。

サービスが、すべてのスレッドが終了する前にサービスが停止したことを SCM に報告した場合、SCM はこれを矛盾として解釈する可能性があります。 これにより、サービスを停止または再起動できない状態になる可能性があります。