我应该在ServiceController上调用Close()吗?

本文关键字:Close 调用 ServiceController 我应该 | 更新日期: 2023-09-27 18:01:39

目前我有这样一个方法:

    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()方法,当他们完成使用它。这些是不好的例子,还是我遗漏了什么?

我应该在ServiceController上调用Close()吗?

您正在使用ServiceControllerusing -语句。这将调用ServiceController上的Dispose,这与显式调用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();
  }
}

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

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

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

等价于:

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

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

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