如何确保Windows服务是处于启动还是启动状态

时间:2010-03-06 13:44:19

标签: c# windows service

我使用ServiceControllerStatus获得启动和启动状态的运行状态。 有没有办法找到服务是否已完全启动

2 个答案:

答案 0 :(得分:3)

ServiceController.Status()属性已使用本机QueryServiceStatus()API函数。如果服务返回SERVICE_START_PENDING状态代码,它将返回ServiceControllerStatus.StartPending。

您必须按原样获取返回值,该服务完全控制其状态代码。如果您从未获得StartPending,那么该服务很可能只需要任何时间来开始。这很常见。如果您发现该服务暂时没有响应,即使您获得了运行状态,那么服务实现也存在缺陷。

答案 1 :(得分:1)

是的,但有点难看:

导入ADVAPI32.DLL:

[DllImport ("advapi32.dll", EntryPoint = "QueryServiceStatus", CharSet = CharSet.Auto)]
internal static extern bool QueryServiceStatus (IntPtr hService, ref SERVICE_STATUS dwServiceStatus);

声明一些结构:

[StructLayout(LayoutKind.Sequential)]
public struct SERVICE_STATUS
{
    public int serviceType;
    public int currentState;
    public int controlsAccepted;
    public int win32ExitCode;
    public int serviceSpecificExitCode;
    public int checkPoint;
    public int waitHint;
}

public enum State
{
    SERVICE_STOPPED = 0x00000001,
    SERVICE_START_PENDING = 0x00000002,
    SERVICE_STOP_PENDING = 0x00000003,
    SERVICE_RUNNING = 0x00000004,
    SERVICE_CONTINUE_PENDING = 0x00000005,
    SERVICE_PAUSE_PENDING = 0x00000006,
    SERVICE_PAUSED = 0x00000007,
}

编辑:更容易使用QueryServiceStatus(),但一般情况下保持不变。请参阅链接了解详细信息,如果我在此处粘贴那么多代码,我认为这没有用。

然后,您可以使用ControlService和控制代码SERVICE_CONTROL_INTERROGATE来发出状态信息请求。

请参阅 http://msdn.microsoft.com/en-us/library/ms682108(VS.85).aspx

http://www.pinvoke.net/default.aspx/advapi32.ControlService