我使用ServiceControllerStatus获得启动和启动状态的运行状态。 有没有办法找到服务是否已完全启动
答案 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