我应该在ServiceController上调用Close()吗?
问题描述:
目前我有一个像这样的方法:我应该在ServiceController上调用Close()吗?
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
和using
-声明。这将在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();
}
}
答
您例如,在使用语句,该语句将调用Dispose
,这将清理对象包装的ServiceController
。这相当于拨打Close
。
答
Close()
没有被调用,因为这里使用了using
语法糖。
using (var resource = new Resource())
{
}
相当于:
{
var resource = new Resource();
try
{
}
finally
{
if (resource != null)
{
resource.Dispose();
}
}
}
到Dispose()
的自动呼叫清理资源。
请参阅this blog文章以获取更多信息。
答
我已经使用了close()方法,但我不能dispose()再次使用。 Dispose()已经在数据库中使用了连接...
我不知道为什么两个人对此投了赞成票。最后一句没有意义,第一句是* false *。你可以一遍又一遍地调用Dispose()。规范说,Dispose()必须能被调用任意次数。 – 2013-03-03 06:42:26