.NET Windows Service OnStart hangs on Process.ProcessName

  • Thread starter Thread starter Guest
  • Start date Start date
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
 
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
 
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.
 
Back
Top