Hi...
I inherited some code where someone wanted to start/stop services and
display a little ... progress bar while waiting.
Originally it was implemented with
ServiceController.{Start|Stop}()
for (int i = 0; i < 60; i++)
{
Console.WriteLine (".");
try
{
ServiceController.WaitForStatus (desiredState, TimeSpan.FromSeconds(1));
}
catch
{//ignore}
if (ServiceController.Status == desiredState) break;
}
Knowing how expensive exception processing is, I tried replacing it with
if (ServiceController.Status == desiredState) break;
Thread.Sleep(1000);
I'm finding, however, that the direct comparison is never reached no matter
how long I wait. Unless WaitForStatus is called (and the exception that
comes with it, usually 4 or 5 seconds/exceptions), the comparison doesn't
work.
I didn't find anything in the docs about this; is this just a known oddity
of the ServiceController? Seems like WaitForStatus could at least have been
friendlier and returned some kind of boolean success rather than throw an
exception - like WaitForMultipleObjects in the old days.
thanks
Mark
Walter Wang [MSFT] - 14 Dec 2007 06:45 GMT
Hi Mark,
If you use Reflector (http://www.aisto.com/roeder/dotnet/) to view the
ServiceController's implementation, you will see the WaitForStatus() is
also calling Refresh() while checking the status:
public void WaitForStatus(ServiceControllerStatus desiredStatus, TimeSpan
timeout)
{
if (!Enum.IsDefined(typeof(ServiceControllerStatus), desiredStatus))
{
throw new InvalidEnumArgumentException("desiredStatus", (int)
desiredStatus, typeof(ServiceControllerStatus));
}
DateTime utcNow = DateTime.UtcNow;
this.Refresh();
while (this.Status != desiredStatus)
{
if ((DateTime.UtcNow - utcNow) > timeout)
{
throw new TimeoutException(Res.GetString("Timeout"));
}
Thread.Sleep(250);
this.Refresh();
}
}
The Refresh() is a public method.
I understand your concern here is that the exception is expensive; however,
from the timing aspect of this issue, as we're already waiting using sleep,
this is actually might not be a very big issue.
Regards,
Walter Wang (wawang@online.microsoft.com, remove 'online.')
Microsoft Online Community Support
==================================================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
Mark - 14 Dec 2007 14:26 GMT
Thanks, Walter... That was just what I needed...