4

目前我有这样的方法:

    private bool IsMyServiceRunning(string serviceName)
    {
        if (String.IsNullOrEmpty(serviceName))
            throw new InvalidOperationException("ServiceName cannot be null or empty");

        using (var service = new ServiceController(serviceName))
        {
            if (service.Status == ServiceControllerStatus.Running)
                return true;
            else
                return false;
        }
    }

这是使用 ServiceController 类的正确方法吗?

我问的原因是,我看到的所有示例在使用完Close()方法后都没有调用它。是那些不好的例子还是我错过了什么?

4

4 回答 4

7

您正在使用ServiceControllerwithusing语句。这将调用DisposeServiceController,这与显式调用 Close() 相同。

因此,在您的情况下,无需再次致电 Close。

如果没有 using 语句,则必须在 ServiceController 上调用 Close() 或 Dispose(),因为它使用了需要释放的非托管资源。否则你有内存泄漏。

ServiceController service = null;

try {
  service = new ServiceController(serviceName);

  if (service.Status == ServiceControllerStatus.Running) {
    return true;
  }
  else {
    return false;
  }
}
finally{
  if (service != null) {
    service.Close(); // or service.Dispose();
  }
}
于 2013-03-01T13:20:59.870 回答
4

您的示例将 包装ServiceController在 using 语句中,该语句将调用Dispose,这将清理对象。相当于调用Close.

于 2013-03-01T13:22:07.223 回答
3

Close()没有被调用,因为using这里使用了语法糖。

using (var resource = new Resource())
{
}

相当于:

{
    var resource = new Resource();
    try
    {
    }
    finally
    {
        if (resource != null)
        {
            resource.Dispose();
        }
    }
}

自动调用Dispose()清理资源。

有关更多信息,请参阅此博客文章。

于 2013-03-01T13:23:19.213 回答
0

我一次又一次地使用了close()方法,但我不能再次使用dispose()。Dispose() 已使用数据库中的连接...

于 2013-03-01T13:23:32.787 回答