【问题标题】:.NET ServiceController.WaitForStatus ignores timeout.NET ServiceController.WaitForStatus 忽略超时
【发布时间】:2015-04-28 11:47:51
【问题描述】:

我有一个 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 表示“为超时参数指定的值过期”。 - 但似乎这并不意味着值达到零之后。

谁能启发我?

【问题讨论】:

    标签: c# .net service timeout servicecontroller


    【解决方案1】:

    当我们指定 TimeSpan 时,WaitForStatus 将在等待给定时间后引发超时异常,但似乎是您的权限异常。

    请阅读this answer

    【讨论】:

    • 不,这不是权限问题。我事先专门处理身份验证。当用户尝试连接远程服务器上的服务时,我将首先尝试使用登录的凭据打开它。如果这不起作用,它会抛出一个 InvalidOperationException,这是正确的 - 但是我会要求用户提供不同的凭据并尝试用这些凭据再次打开它。如果这也不起作用,它将返回一条错误消息。但是在我描述的凭据正确的情况下,权限正确但服务器(机器)处于脱机状态。
    • 好吧.. 我不是服务专家,但我编写了相同的代码来停止服务,如果发生超时,它会抛出异常异常消息低于消息] Der Vorgang wurde nicht abgeschlossen, da der Timeout abgelaufen ist. [Source] System.ServiceProcess [StackTrace] bei System.ServiceProcess.ServiceController.WaitForStatus(ServiceControllerStatus desiredStatus, TimeSpan timeout) bei ServiceClient.ServiceClients.StopService(ServiceController service, Int32 timeOut, Int32 waitStop) [Target] Void WaitForStatus(System.ServiceProcess. ServiceControllerStatus, System.TimeSpan)
    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2011-01-18
    • 2023-03-18
    • 2012-03-12
    相关资源
    最近更新 更多