Domanda

Ho un servizio Windows NT in C# che fondamentalmente si sveglia ogni x secondi, controlla se è necessario inviare notifiche di posta, e poi torna a dormire.

Assomiglia a questo (il Timer la classe è dal System.Threading spazio dei nomi):

public partial class MyService : ServiceBase
{
    private Timer _timer;
    private int _timeIntervalBetweenRuns = 10000;

    public MyService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        // when NT Service starts - create timer to wake up every 10 seconds
        _timer = new Timer(OnTimer, null, _timeIntervalBetweenRuns, Timeout.Infinite);
    }

    protected override void OnStop()
    {
        // on stop - stop timer by freeing it
        _timer = null;
    }

    private void OnTimer(object state)
    {
        // when the timer fires, e.g. when 10 seconds are over 
        // stop the timer from firing again by freeing it
        _timer = null;

        // check for mail and sent out notifications, if required - works just fine
        MailHandler handler = new MailHandler();
        handler.CheckAndSendMail();

        // once done, re-enable the timer by creating it from scratch
        _timer = new Timer(OnTimer, null, _timeIntervalBetweenRuns, _timeIntervalBetweenRuns);
    }
}

L'invio della posta e tutto funziona bene, e il servizio si sveglia anche ogni 10 secondi (in realtà, questa è un'impostazione da un file di configurazione - semplificato per questo esempio).

Tuttavia, a volte, il servizio sembra svegliarsi troppo in fretta ....

2010-04-09 22:50:16.390
2010-04-09 22:50:26.460
2010-04-09 22:50:36.483

2010-04-09 22:50:46.500
2010-04-09 22:50:46.537  ** why again after just 37 milliseconds...... ??

2010-04-09 22:50:56.507

Funziona bene a 22: 50: 45.500 - Perché registra un'altra voce solo 37 millisecondi più tardi ??

Qui, sembra che sia totalmente fuori di testa .... sembra svegliarsi due volte o anche tre volte ogni volta che 10 secondi sono finiti ...

2010-04-09 22:51:16.527

2010-04-09 22:51:26.537
2010-04-09 22:51:26.537

2010-04-09 22:51:36.543
2010-04-09 22:51:36.543

2010-04-09 22:51:46.553
2010-04-09 22:51:46.553

2010-04-09 22:51:56.577
2010-04-09 22:51:56.577

2010-04-09 22:52:06.590
2010-04-09 22:52:06.590

2010-04-09 22:52:06.600
2010-04-09 22:52:06.600

Qualche idea perché ?? Non è un grosso problema, ma sono preoccupato che potrebbe iniziare a mettere troppo carico sul server, se l'intervallo che configura (10 secondi, 30 secondi - qualunque cosa) sembra essere sempre più ignorato, più a lungo il servizio funziona .

Ho perso qualcosa di molto fondamentale nel mio codice di servizio ?? Sto finendo con più timer o qualcosa del genere ?? Non riesco a capirlo davvero ..... ho scelto il timer sbagliato (System.Threading.Timer)? Ci sono almeno 3 classi di timer in .NET - perché ?? :-)

È stato utile?

Soluzione

In realtà, il problema sembra essere Ho preso la classe Timer sbagliata.

Con la System.Threading.Timer, ho questi problemi ho spiegato nella mia domanda iniziale.

Quando sono passato a System.Timers.Timer, tutti questi problemi se ne andò.

Quindi questo pone ancora la domanda: perché sulla terra ci sono almeno tre diverse classi Timer nel framework .NET, e quali sono le (sottili) differenze tra di loro

Altri suggerimenti

non è evidente guardando il codice di cui sopra, che si stanno ottenendo più timer. ma a mio parere che può essere il caso. perché implementa IDisposable System.Threading.Timer così invece di annullamento dei fuori della variabile si dovrebbe chiamare invece il metodo Dispose.

MSDN dice ...

  

Quando non è più necessario un timer, l'uso   il metodo Dispose alla libera   risorse detenute dal timer.

Questo è probabilmente perché il messaggio oleodotto.

A volte i messaggi vengono inviati timer, ma non trattati abbastanza in fretta, in modo che siano impilati ed elaborati in sequenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top