Solved

Is Service Installed Hangup?

Posted on 2010-11-09
11
279 Views
Last Modified: 2012-05-10

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
Comment
Question by:pointeman
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 3
  • +1
11 Comments
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 34097648
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
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 34097658
Correction:

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

I'm guessing that "service.ServiceName == svcName" is what is causing...
0
 
LVL 5

Expert Comment

by:Kenneth Brown
ID: 34097660
Step through the code in debugger to find which actual line throws the error.
0
Creating Instructional Tutorials  

For Any Use & On Any Platform

Contextual Guidance at the moment of need helps your employees/users adopt software o& achieve even the most complex tasks instantly. Boost knowledge retention, software adoption & employee engagement with easy solution.

 

Author Comment

by:pointeman
ID: 34097669
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
 
LVL 13

Expert Comment

by:iHadi
ID: 34097695
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
 

Author Comment

by:pointeman
ID: 34097698
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
 
LVL 75

Accepted Solution

by:
käµfm³d   👽 earned 500 total points
ID: 34097727
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
 

Author Comment

by:pointeman
ID: 34097796
Good greif, isn't there a better way to look for a service exists before calling ServceControllers?
0
 
LVL 5

Expert Comment

by:Kenneth Brown
ID: 34097828
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
 
LVL 5

Expert Comment

by:Kenneth Brown
ID: 34097900
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
 

Author Comment

by:pointeman
ID: 34102735
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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Extention Methods in C# 3.0 by Ivo Stoykov C# 3.0 offers extension methods. They allow extending existing classes without changing the class's source code or relying on inheritance. These are static methods invoked as instance method. This…
Summary: Persistence is the capability of an application to store the state of objects and recover it when necessary. This article compares the two common types of serialization in aspects of data access, readability, and runtime cost. A ready-to…

740 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question