Le service Windows OnStop attend le traitement terminé

J'ai fait développer un service Windows dans visual studio 2012 /.NET 4.5.

Le service est suivant le schéma de l'extrait de code ci-dessous:

  • L'aide d'une minuterie
  • Exécute l'opération souhaitée toutes les deux minutes.
  • Le processus prend environ 10 minutes
  • - Je utiliser un seul fil dans le service

Ce que je suis inquiète, c'est que si quelqu'un arrête le service via la console de gestion, il pourrait être juste pendant le processus que le service est en train de faire.

J'ai fait un peu de lecture à propos de l'arrêt de Windows service avec demande d'arrêter, mais je suis un peu perdu. Parfois WorkerThreads sont créés, parfois ManualResetEvents sont créés, mais jusqu'à maintenant, je ne pouvais pas saisir pleinement la meilleure voie à suivre pour mon service Windows.

J'ai besoin d'attendre jusqu'à ce que le traitement est bien fini dans la méthode onStop avant d'arrêter le service Windows.

Quelle est la meilleure façon de l'avant, compte tenu également de l'extrait de code ci-dessous?

Merci à tous!

namespace ImportationCV
{
public partial class ImportationCV : ServiceBase
{
private System.Timers.Timer _oTimer;       
public ImportationCV()
{
InitializeComponent();
if (!EventLog.SourceExists(DAL.Utilities.Constants.LOG_JOURNAL))
{
EventLog.CreateEventSource(DAL.Utilities.Constants.LOG_JOURNAL,     DAL.Utilities.Constants.SOURCE_JOURNAL);
}
EventLog.Source = DAL.Utilities.Constants.SOURCE_JOURNAL;
EventLog.Log = DAL.Utilities.Constants.LOG_JOURNAL;
}
protected override void OnStart(string[] args)
{            
int intDelai = Properties.Settings.Default.WatchDelay * 1000;
_oTimer = new System.Timers.Timer(intDelai);
_oTimer.Elapsed += new ElapsedEventHandler(this.Execute);
_oTimer.Start();           
EventLog.WriteEntry(DAL.Utilities.Constants.LOG_JOURNAL, "Service " + DAL.Utilities.Constants.SERVICE_TITLE + " started at " + DateTime.Now.ToString("HH:mm:ss"), EventLogEntryType.Information);
}
protected override void OnStop()
{
if (_oTimer != null && _oTimer.Enabled)
{
_oTimer.Stop();
_oTimer.Dispose();
}
EventLog.WriteEntry(DAL.Utilities.Constants.LOG_JOURNAL, "Service " + DAL.Utilities.Constants.SERVICE_TITLE + " stopped at " + DateTime.Now.ToString("HH:mm:ss"), EventLogEntryType.Information);
}
private void Execute(object source, ElapsedEventArgs e)
{
_oTimer.Stop();
try
{                
//Process
}
catch (Exception ex)
{
EventLog.WriteEntry(DAL.Utilities.Constants.LOG_JOURNAL, (ex.StackTrace + ("\r\n" + ex.Message)), EventLogEntryType.Error);
}
_oTimer.Start();
}
}
}

source d'informationauteur crisjax | 2014-03-20