【问题标题】:Do you know any alternatives to ServiceController class (C#)你知道ServiceController类(C#)的任何替代品吗
【发布时间】:2013-01-09 21:43:49
【问题描述】:

问题在于,一旦我们尝试启动一个缓慢/永不启动的服务,如果它花费的时间太长,我们就无法“取消”它:

 ServiceController ssc = new ServiceController(serviceName);
 ssc.Start();
 ssc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(ts)));

假设我们将“ts”设置为太长,例如 300 秒,在等待 120 秒后我决定取消操作,我不想等待服务控制器状态更改或等待时间出现这种情况,我该怎么办?

【问题讨论】:

    标签: c# servicecontroller


    【解决方案1】:

    您可以编写自己的 WaitForStatus 函数,该函数接受 CancellationToken 来获取取消功能。

    public void WaitForStatus(ServiceController sc, ServiceControllerStatus statusToWaitFor,
        TimeSpan timeout, CancellationToken ct)
    {
        var endTime = DateTime.Now + timeout;
        while(!ct.IsCancellationRequested && DateTime.Now < endTime)
        {
             sc.Refresh();
             if(sc.Status == statusToWaitFor)
                 return;
    
             // may want add a delay here to keep from
             // pounding the CPU while waiting for status
        }
    
        if(ct.IsCancellationRequested)
        { /* cancel occurred */ }
        else
        { /* timeout occurred */ }
     }
    

    【讨论】:

    • 但是我对上面的代码有一个问题,iiuc 它正在扩展 ServiceController 类,那么为什么要传递 ServiceController 的实例,除非我遗漏了什么,我们不应该引用对象本身('this')而不是传递引用?
    • @safejrz 我写它的方式允许你把函数放在任何你想要的地方。您可以从ServiceController 派生一个——在这种情况下,是的,您不需要传入ServiceController,您也可以通过在this 上使用this 修饰符使其成为扩展方法@,或者您可以将其作为需要代码的类中的静态方法。这完全取决于您,什么最适合您、您的团队和您的代码库。
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2011-03-07
    • 2010-12-22
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多