Comment empêcher le Système.Les minuteries.La minuterie de la file d'attente pour l'exécution sur un pool de threads?

Il y a un problème avec le Système standard.Les minuteries.Minuteur de comportement. La minuterie élever Écoulé événement avec un certain intervalle de temps. Mais quand le temps d'exécution à l'intérieur Écoulé gestionnaire d'événement dépasser intervalle de minuterie alors pool de threads commencer les files d'attente de la gestion des événements. C'est un problème dans mon cas. C'est parce que avec mon Écoulé gestionnaire d'événement j'ai récupérer des données à partir de la base de données et de faire quelque chose avec elle et enfin d'enregistrer les résultats dans la base de données. Mais la manipulation des données doivent être fournies une seule fois. Donc, est-il un moyen pour éviter les files d'attente s'écouler des événements du Système.Les minuteries.Minuterie.

Comme illustration de ce problème, vous pouvez envisager prochain programme de test:

public class EntryPoint
{

    private static void TimeProc(object state, ElapsedEventArgs e)
    {
        Console.WriteLine("Current time {0} on the thread {1}", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(20000);
    }

    static void Main(string[] args)
    {
        Console.WriteLine("Press <Enter> for finishing\n\n");
        ThreadPool.SetMaxThreads(10, 10);
        System.Timers.Timer MyTimer = new System.Timers.Timer(1000);
        MyTimer.Elapsed += new ElapsedEventHandler(TimeProc);
        MyTimer.Start();
        Console.ReadLine();
        MyTimer.Stop();
    }
}

Et de sortie possibles seront comme ici:

Current time 03.02.2011 0:00:09 on the thread 4
Current time 03.02.2011 0:00:10 on the thread 5
Current time 03.02.2011 0:00:12 on the thread 6
Current time 03.02.2011 0:00:13 on the thread 7
Current time 03.02.2011 0:00:14 on the thread 8
Current time 03.02.2011 0:00:15 on the thread 9
Current time 03.02.2011 0:00:16 on the thread 10
Current time 03.02.2011 0:00:17 on the thread 11
Current time 03.02.2011 0:00:18 on the thread 12
Current time 03.02.2011 0:00:19 on the thread 13
Current time 03.02.2011 0:00:30 on the thread 4
Current time 03.02.2011 0:00:30 on the thread 5

Solutions possibles:

1) Il a été inspiré par:C# Minuterie vs Thread en Service

Et il y a un code comme ici concernant mentionné ci-dessus, exemple:

    public class EntryPoint
    {
        private static System.Timers.Timer MyTimer;
        private static void TimeProc(object state, ElapsedEventArgs e)
        {
            Console.WriteLine("Current time {0} on the thread {1}", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(20000);
            MyTimer.Enabled = true;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Press <Enter> for finishing\n\n");
            ThreadPool.SetMaxThreads(10, 10);
            MyTimer = new System.Timers.Timer(1000);
            MyTimer.AutoReset = false;

            MyTimer.Elapsed += new ElapsedEventHandler(TimeProc);
            MyTimer.Enabled = true;
            Console.ReadLine();

        }
    }

2) la Deuxième façon est d'environ SynchronizingObject, mais c'est valable uniquement pour application Windows form ou supplémentaires nécessaires au développement de code pour la mise en œuvre de l'objet qui serait implémente ISynchronizeInvoke interface. Plus au sujet de cette façon, vous pouvez trouver ici

Donc, pour l'instant je préfère la première solution.

la minuterie n'a pas un problème... cela se produit partout dans l'endroit. C'est effectivement sympa qu'il met en file d'attente Écoulé événements. si c'est une interruption matérielle vous me soufflait votre intervalle et vous ne pouvez pas le récupérer.
Si les données doivent être manipulés uniquement une fois alors pourquoi la répétition de minuterie ou voulez-vous dire au plus une fois tous les X temps?
Dans mon cas, une autre application de sauvegarder des données dans une base de données et mon application doit lire et le manipuler.

OriginalL'auteur apros | 2011-02-02