ServiceController是非阻塞操作吗?

时间:2014-03-19 19:00:07

标签: c# multithreading visual-studio-2005

我正在查看有关ServiceController的文档,但我找不到任何关于它的阻止属性的内容。

我们启动3个服务(使用ServiceController Start方法),我想知道启动命令是否会启动,然后移动到下一个,或者如果第一个必须完成启动,那么第二个然后是第三个(在这种情况下,我们会说服务独立于其他服务,不需要以任何特定顺序“启动”)

我不确定找到这些信息的“好”方式,我可以花时间编写两个应用程序,一个启动第二个,第二个不会“正式”启动,直到我按下按钮,那么我可以测试它是阻塞还是非阻塞,是否有文档说明这个或更简单的方法?

注意:我目前正在使用Visual Studio 2005,如果你的答案有任何不同。

1 个答案:

答案 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线程。