.NET Windows Service OnStart hangs on Process.ProcessName

G

Guest

Hi,
We have a C# application running as a Windows Service. Once the service is
installed and a start is done on the service, the process will block when
accessing information about the current process. The example below placed in
the OnStart of a class inheriting from ServiceBase will hang on the
proc.ProcessName line.
using(System.Diagnostics.Process proc =
system.Diagnostics.Process.GetCurrentProcess())
{
return proc.ProcessName; // This line will hang long enough to prevent
the service from starting for timeout reason.
}

This hanging issue seems to happen only once in a while. Usually, the first
startup of the service will hang and timeout. The second startup will start
ok, the third will timeout and so on.

Is there a workaround or a fix for this issue?

Environment information:
OS : WinXP SP1
..NET: 1.1 SP1

Thanks!
Simon
 
W

Willy Denoyette [MVP]

Sure, don't run this in OnStart. OnStart is only meant to initialize your
service variables and kick-off a service thread to run the real service
code, OnStart must return before the SCM times out, that is withing 30
seconds.
So you need to run this on a separate thread.

Willy.

| Hi,
| We have a C# application running as a Windows Service. Once the service is
| installed and a start is done on the service, the process will block when
| accessing information about the current process. The example below placed
in
| the OnStart of a class inheriting from ServiceBase will hang on the
| proc.ProcessName line.
| using(System.Diagnostics.Process proc =
| system.Diagnostics.Process.GetCurrentProcess())
| {
| return proc.ProcessName; // This line will hang long enough to prevent
| the service from starting for timeout reason.
| }
|
| This hanging issue seems to happen only once in a while. Usually, the
first
| startup of the service will hang and timeout. The second startup will
start
| ok, the third will timeout and so on.
|
| Is there a workaround or a fix for this issue?
|
| Environment information:
| OS : WinXP SP1
| .NET: 1.1 SP1
|
| Thanks!
| Simon
 
G

Guest

Just using System.Reflection.Assembly.GetEntryAssembly().Location gets the
entry assembly location from which you can retrieve the process name. This is
only applicable if running from default application domain.
Or another solution is to use Environment.GetCommandLineArgs(). It returns
an array and the first element in the array contains the file name of the
executing program. These 2 solutions are not resource intensive and do work
well for my needs. Thanks.
 
P

Peter Huang [MSFT]

Hi

Thanks for your update!

Best regards,

Peter Huang
Microsoft Online Partner Support

Get Secure! - www.microsoft.com/security
This posting is provided "AS IS" with no warranties, and confers no rights.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top