Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该在ServiceController上调用Close()吗?_C#_.net - Fatal编程技术网

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

C# 我应该在ServiceController上调用Close()吗?,c#,.net,C#,.net,目前我有这样一种方法: private bool IsMyServiceRunning(string serviceName) { if (String.IsNullOrEmpty(serviceName)) throw new InvalidOperationException("ServiceName cannot be null or empty"); using (var service = new Service

目前我有这样一种方法:

    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();
  }
}

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

Close()
,因为这里使用了
使用的语法糖,所以没有调用它

using (var resource = new Resource())
{
}
相当于:

{
    var resource = new Resource();
    try
    {
    }
    finally
    {
        if (resource != null)
        {
            resource.Dispose();
        }
    }
}
Dispose()
的自动调用会清理资源


有关更多信息,请参阅帖子。

我已经多次使用了close()方法,但我无法再次使用dispose()。Dispose()已使用数据库中的连接

我不知道为什么有两个人投了这个票。最后一句没有意义,第一句是错误的。您可以一遍又一遍地调用
Dispose()
。规范规定,
Dispose()
必须能够被调用任意次数。