• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 284
  • Last Modified:

Is Service Installed Hangup?


The following "IsServiceInstalled" method looks good, but it throws errors when cannot find a service.

I don't understand why it doesn't simply return "false" if a service is not found.

I use this code to call the following method;

        if (IsServiceInstalled(control.ServiceName))                    
        //run other code

        private bool IsServiceInstalled(string svcName)
        {
            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController service in services)
            {
                if (service.ServiceName == svcName)
                    return true;
            }
            return false;
        }

       
0
pointeman
Asked:
pointeman
  • 4
  • 3
  • 3
  • +1
1 Solution
 
käµfm³d 👽Commented:
I'm guessing that "ServiceController.GetServices()" is what is causing the exception. Even though you can enumerate the running services on a system, I have run into issues where certain processes cannot be accessed because of permissions. I would suggest putting a try/catch inside your foreach and/or elevating your program. I'm not completely sure the latter will do the trick.
0
 
käµfm³d 👽Commented:
Correction:

>>  I'm guessing that "ServiceController.GetServices()" is what is causing

I'm guessing that "service.ServiceName == svcName" is what is causing...
0
 
Kenneth BrownResearch AssociateCommented:
Step through the code in debugger to find which actual line throws the error.
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
pointemanAuthor Commented:
The more I think about it, I wonder if I'm not waiting long enough for a result. I know the list of services on any pc would be long.
Here's the method I use to call each servicecontroller:

foreach (ServiceController control in controllers)
{
       if (IsServiceInstalled(control.ServiceName))
       {
             ServiceCommand(control, (string)command);
       }
       Thread.Sleep(5000);
}  
 
0
 
iHadiCommented:
The code runs smoothly without any exceptions and returns false if not found. Can you post the exception you are getting and the stack trace
0
 
pointemanAuthor Commented:
Doing this, but not any better:
try
{
       private bool IsServiceInstalled(string svcName)
        {
            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController service in services)
            {
                if (service.ServiceName == svcName)
                    return true;
            }            
}
catch
{
     return false;
}
  return true;
}

 
0
 
käµfm³d 👽Commented:
That's not even valid code. You can't surround a function definition with a try/catch. What I was referring to was more like:
private bool IsServiceInstalled(string svcName)
{
    ServiceController[] services = ServiceController.GetServices();

    foreach (ServiceController service in services)
    {
        try
        {
            if (service.ServiceName == svcName)
                return true;
        }
        catch
        {
            // One failed
        }
    }
} 

Open in new window

0
 
pointemanAuthor Commented:
Good greif, isn't there a better way to look for a service exists before calling ServceControllers?
0
 
Kenneth BrownResearch AssociateCommented:
In your new sleep 5s method - when does it error? immediately, or after some time - that would surely indicate where roughly the problem is....
0
 
Kenneth BrownResearch AssociateCommented:
I missed a few posts, but surely the try/catch is just a temporary measure to narrow down what is causing the problem so you can handle it more nicely; not an actual solution. Is there any reason you cant debug it as my suggestion?
0
 
pointemanAuthor Commented:
Using this to solve problem, thanks....  

       private bool IsServiceInstalled(string svcName)
       {
           ServiceController[] services = ServiceController.GetServices();

           foreach (ServiceController service in services)
           {
                try
                {
                      if (service.ServiceName == svcName)
                             return true;
                }
                catch
                {
                     return false;
                }
               return false;
       }

 
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

  • 4
  • 3
  • 3
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now