2013-03-01 2 views
3

В настоящее время у меня есть метод, как это:Должен ли я называть Close() на ServiceController?

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

Вы используете ServiceController с кодом using. Это вызовет Dispose на ServiceController, который будет аналогичен вызову Close().

Так что в вашем случае нет необходимости снова звонить Close.

Без использования инструкции необходимо вызвать функцию Close() или Dispose() на ServiceController, чтобы использовать неуправляемые ресурсы, которые необходимо освободить. В противном случае у вас есть утечка памяти.

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

Ваш пример оборачивает ServiceController в использовании заявление, которое будет вызывать Dispose, который будет убирать объект. Это эквивалентно вызову 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()' должно быть вызвано сколько угодно раз. –

Смежные вопросы