Solved

How to stop a Windows Service gracefully?

Posted on 2007-11-19
3
819 Views
Last Modified: 2013-11-26
I have a Windows Service which processes some files every X seconds. The service should run 24/7 unless there is an exception, in which case I stop the service. However, there are times when I would want to stop the service manually (through Admin Tools/Services). How do I ensure that when I do that while the function that does the file processing is still executing, the service will wait for the function to finish? Is there anything I can put in OnStop() to detect whether the function is running or not? I suppose I could have the function turn some app settings on when it starts executing and off when it finishes executing, and add some code in OnStop() to check the setting. However, I would have to implement a loop to constantly check for the flag, plus I don't know how long OnStop() can wait?

I would appreciate any suggestions. Thank you.
0
Comment
Question by:EwS
  • 2
3 Comments
 
LVL 10

Assisted Solution

by:MrClyfar
MrClyfar earned 100 total points
ID: 20313830
Hi there.

Here's a link to a similar issue:

http://www.thescripts.com/forum/thread124604.html

What you can do is use the thread.Join technique to try and come to a smooth halt.

Hope this help.s
Jas.
0
 
LVL 8

Expert Comment

by:slado2
ID: 20314263
If your service takes some time to stop you should inform servicemanager that the service status is stop pending and you need some more time.
http://msdn2.microsoft.com/en-us/library/d56de412(VS.80).aspx
0
 
LVL 8

Accepted Solution

by:
slado2 earned 150 total points
ID: 20314755
To make things clear:
I assume that your service processing (file operations in your case) is done in a separate thread. When OnStop is called then you should call Join(int Time)
http://msdn2.microsoft.com/en-us/library/6b1kkss0.aspx
The call RequestAdditionalTime to inform the service manager that your service is still stopping if the thread is not finished yet.
http://msdn2.microsoft.com/en-us/library/system.serviceprocess.servicebase.requestadditionaltime.aspx
protected override void OnStop()
{
  int joinTimeout = 500; // 500 ms
  while(!FileProcessingThread.Join(joinTimeout))
  {
    this.RequestAdditionalTime(1000);  // request additional 1 second to stop the service
  }
}

Open in new window

0

Featured Post

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

Welcome my friends to the second instalment and follow-up to our Minify and Concatenate Your Scripts and Stylesheets (http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/A_4334-Minify-and-Concatenate-Your-Scripts-and-Stylesheets.html)…
This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

830 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