2013-03-01 121 views
3

目前我有一个像这样的方法:我应该在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()方法。这些不好的例子还是我错过了什么?

回答

4

您正在使用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(); 
    } 
} 
4

您例如,在使用语句,该语句将调用Dispose,这将清理对象包装的ServiceController。这相当于拨打Close

3

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

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

相当于:

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

Dispose()的自动呼叫清理资源。

请参阅this blog文章以获取更多信息。

1

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

+0

我不知道为什么两个人对此投了赞成票。最后一句没有意义,第一句是* false *。你可以一遍又一遍地调用Dispose()。规范说,Dispose()必须能被调用任意次数。 – 2013-03-03 06:42:26

相关问题