我正在查看有关ServiceController的文档,但我找不到任何关于它的阻止属性的内容。
我们启动3个服务(使用ServiceController
Start方法),我想知道启动命令是否会启动,然后移动到下一个,或者如果第一个必须完成启动,那么第二个然后是第三个(在这种情况下,我们会说服务独立于其他服务,不需要以任何特定顺序“启动”)
我不确定找到这些信息的“好”方式,我可以花时间编写两个应用程序,一个启动第二个,第二个不会“正式”启动,直到我按下按钮,那么我可以测试它是阻塞还是非阻塞,是否有文档说明这个或更简单的方法?
注意:我目前正在使用Visual Studio 2005,如果你的答案有任何不同。
答案 0 :(得分:1)
使用JustDecompile,这是它为Start方法提供的代码的一部分:
try
{
gCHandle = GCHandle.Alloc(hGlobalUni, GCHandleType.Pinned);
if (!UnsafeNativeMethods.StartService(serviceHandle, (int)args.Length, gCHandle.AddrOfPinnedObject()))
{
Exception exception = ServiceController.CreateSafeWin32Exception();
object[] serviceName = new object[] { this.ServiceName, this.MachineName };
throw new InvalidOperationException(Res.GetString("CannotStart", serviceName), exception);
}
}
本机方法声明为
[DllImport("advapi32.dll", CharSet=CharSet.Unicode, ExactSpelling=false, SetLastError=true)]
public static extern bool StartService(IntPtr serviceHandle, int argNum, IntPtr argPtrs);
来自StartService的文档:
启动服务时,服务控制管理器(SCM)会生成 必要时,服务流程。如果指定的服务共享一个 与其他服务一起处理,所需的过程可能已经存在。 StartService函数不会等待第一次状态更新 从新服务,因为它可能需要一段时间。相反,它返回 当SCM收到服务控制调度员的通知时 已成功创建此服务的ServiceMain线程。