2013-03-01 53 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

相關問題