.NET ServiceController.WaitForStatus 忽略超时时间

4
我有一个WinForm应用程序和一个服务,该服务在服务器上从应用程序执行某些工作。我希望用户能够从应用程序控制服务,因此我添加了一个ServiceController来完成所有工作(一开始只是启动、停止、重新启动)。到目前为止一切都很好,但在测试不同的场景时,我遇到了一个问题:我的服务正在服务器上运行,应用程序正在同一网络中的客户端上运行。我连接到服务并打开ServiceController。

然后我关闭了运行服务的服务器(VM),并从客户端触发了停止方法。我使用WaitForStatus方法和超时,但问题是:应用程序似乎忽略了超时。

public void StopService()
    {
        if (this._serviceController.CanStop &&
            (this.ServiceStatus == ServiceControllerStatus.Running || this.ServiceStatus == ServiceControllerStatus.Paused))
        {
            this._serviceController.Stop();
            this._serviceController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(30));
        }

    }

在我的情况下,该方法似乎会尝试停止服务约90秒钟,然后抛出InvalidOperationException异常,我可以处理它,但我不希望用户等待90秒。 我想我的问题基本上是:当计时器(在这种情况下为30秒)耗尽时会发生什么? 代码不应该继续运行吗? 这个函数何时会抛出TimeoutException? MSDN说“超时参数指定的值过期时。”-但似乎这并不意味着在值达到零之后。 能有人给我解释一下吗?
1个回答

1
当我们指定TimeSpan时,等待给定时间后WaitForStatus将引发超时异常,但似乎您遇到了特权异常。
请阅读 this answer

不,这不是权限的问题。我事先专门处理了身份验证。当用户尝试连接远程服务器上的服务时,我会首先尝试使用已登录的凭据打开它。如果这样不行,它会抛出InvalidOperationException异常 - 但然后我会要求用户提供不同的凭据,并再次尝试使用它们打开它。如果这也不起作用,它将返回一个错误消息。但在我描述的情况下,凭据是正确的,权限也是正确的,但服务器(机器)处于离线状态。 - DangerousDetlef
1
好的,我不是服务方面的专家,但我已经编写了相同的代码来停止服务,如果超时发生,则会抛出异常。异常消息如下:[Message] 操作未完成,因为超时已过期。 [Source] System.ServiceProcess [StackTrace] 在 System.ServiceProcess.ServiceController.WaitForStatus(ServiceControllerStatus desiredStatus, TimeSpan timeout) 在 ServiceClient.ServiceClients.StopService(ServiceController service, Int32 timeOut, Int32 waitStop) [Target] Void WaitForStatus(System.ServiceProcess.ServiceControllerStatus, System.TimeSpan) - Sivakrishna Donepudi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接