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

时间:2013-03-01 13:18:30

标签: c# .net

目前我有一个这样的方法:

    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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

Close()未被调用,因为此处使用了using句法糖。

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

相当于:

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

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

有关详细信息,请参阅this blog帖子。

答案 3 :(得分:1)

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