Attendre la fin d'un événement écoulé avant que l'application / le service ne se ferme / s'arrête

Résumé:
Au sein d'un service Windows & Application de Console que j'appelle une bibliothèque commune qui contient un Timer qui déclenche régulièrement une action qui prend environ 30 secondes pour terminer. Cela fonctionne bien, mais...

Lorsqu'un arrêt ou la fermeture de l'application est appelée et que la minuterie est en ElapsedEventHandler j'ai besoin de l'arrêt du service/de l'application sortie d'attendre jusqu'à ce que le gestionnaire d'événement est terminé.

J'ai implémenté cette fonctionnalité en ayant un Booléen InEvent propriété qui est vérifiée lorsque la minuterie d'arrêt de la méthode est appelée.

Tout ce qui est fonctionnel, la question est: Est-ce la meilleure façon de faire cela? Est-il une autre approche qui peut servir à cette fin mieux?

L'autre problème est que j'ai besoin pour éviter le service de demande d'arrêt à défaut avec un "Service n'a pas répondu à la demande d'arrêt"

C'est ma mise en œuvre

public sealed class TimedProcess : IDisposable
{
    static TimedProcess singletonInstance;
    bool InEvent;
    Timer processTimer;

    private TimedProcess()
    {
    }

    public static TimedProcess Instance
    {
        get
        {
            if (singletonInstance == null)
            {
                singletonInstance = new TimedProcess();
            }

            return singletonInstance;
        }
    }

    public void Start(double interval)
    {
        this.processTimer = new Timer();
        this.processTimer.AutoReset = false;
        this.processTimer.Interval = interval;
        this.processTimer.Elapsed += new ElapsedEventHandler(this.processTimer_Elapsed);
        this.processTimer.Enabled = true;
    }

    public void Stop()
    {
        if (processTimer != null)
        {
            while (InEvent)
            {
            }

            processTimer.Stop();
        }
    }

    void processTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        try
        {
            InEvent = true;
            //Do something here that takes ~30 seconds
        }
        catch
        {
        }
        finally
        {
            InEvent = false;
            processTimer.Enabled = true;
        }
    }

    public void Dispose()
    {
        if (processTimer != null)
        {
            Stop();
            processTimer.Dispose();
        }
    }
}

Et ce est la façon dont il est appelé dans le service de Démarrage /de la console principale de l'application:

TimedProcess.Instance.Start(1000);

C'est la façon dont il est appelé au service OnStop et principale de l'application (en attente d'une pression de touche):

TimedProcess.Instance.Stop();

source d'informationauteur MrEyes