.NET ServiceController.WaitForStatus忽略超时

时间:2015-04-28 11:47:52

标签: c# .net service timeout servicecontroller

我有一个WinForm应用程序和一个服务,它可以从服务器上的应用程序中完成一些工作。我希望用户能够从应用程序控制服务,所以我添加了一个ServiceController来完成所有工作(首先是Start,Stop,Restart)。到目前为止一切正常但在测试不同场景时我遇到了一个问题:我的服务在服务器上运行,应用程序在同一网络中的客户端上运行。我连接到服务并打开ServiceController。

然后我关闭运行服务的服务器(VM)并从客户端触发stop方法。我使用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 个答案:

答案 0 :(得分:1)

当我们指定TimeSpan时,WaitForStatus会在等待给定时间后上升超时异常,但似乎是您对特权有例外。

请阅读this answer