title: Check if a service exists on a particular machine without using exception handling
body: <p>Don't know if there is a better way to do this, so that is the reason for the question. I can check if a service exists on a particular machine with the following code:</p>
  
  <pre><code>bool DoesServiceExist(string serviceName, string machineName)
  {
      ServiceController controller = null;
      try
      {
          controller = new ServiceController(serviceName, machineName);
          controller.Status;
          return true;
      }
      catch(InvalidOperationException)
      {
          return false;
      }
      finally
      {
           if (controller != null)
           {
               controller.Dispose();
           }
      }
  }
  </code></pre>
  
  <p>but this seems like an ineffecient solution to me (due to the exception handling). Is there a better way to check if a service exists. Note - I have recently switched to .Net 4.0 so if someone knows of a better solution in 4.0 that would be acceptable.</p>
  
  <p>EDIT:
  Here is a sample c# console app to test the performance of my example as well as the GetServices code sample. In my testing I found that the GetServices is much more performative in the case where the service does not exist, but is twice as slow when the service does exist:</p>
  
  <pre><code>    static void Main(string[] args)
      {
          string serviceName = string.Empty;
          string machineName = string.Empty;
  
          var sw = new Stopwatch();
          sw.Reset();
          sw.Start();
          for (int i = 0; i &lt; 1000; i++)
          {
              ServiceExistsException(serviceName, machineName);
          }
          sw.Stop();
          Console.WriteLine("Elapsed time: " + sw.ElapsedMilliseconds.ToString());
          sw.Reset();
          sw.Start();
          for (int i = 0; i &lt; 1000; i++)
          {
              ServiceExistsGetList(serviceName, machineName);
          }
          sw.Stop();
          Console.WriteLine("Elapsed time: " + sw.ElapsedMilliseconds.ToString());
  
          Console.WriteLine("Done");
          Console.ReadLine();
      }
  
      static bool ServiceExistsException(string serviceName, string machineName)
      {
          ServiceController controller = null;
          try
          {
              controller = new ServiceController(serviceName, machineName);
              string name = controller.DisplayName;
              return true;
          }
          catch (InvalidOperationException)
          {
              return false;
          }
          finally
          {
              if (controller != null)
              {
                  controller.Dispose();
              }
          }
      }
  
      static bool ServiceExistsGetList(string serviceName, string machineName)
      {
          ServiceController[] services = null;
          try
          {
              services = ServiceController.GetServices(machineName);
              var service = services.FirstOrDefault(s =&gt; s.ServiceName == serviceName);
              return service != null;
          }
          finally
          {
              if (services != null)
              {
                  foreach (ServiceController controller in services)
                  {
                      controller.Dispose();
                  }
              }
          }
      }
  }
  </code></pre>