目前我有一个这样的方法:
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()方法。那些不好的例子还是我错过了什么?
答案 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()使用了数据库中的连接......