7
votes

C # minuterie vs thread en service

J'ai un service qui frappe une base de données toutes les 10 secondes et obtient les données s'il y en a. La chose est que le traitement de ces données peut prendre jusqu'à 30 secondes. Si j'utilise une minuterie avec une intervalle de 10 secondes, le service obtiendra les mêmes données deux fois.

L'effet qui essaie d'obtenir (juste pour la visualisation): xxx

ppl disant thre thread.sleep est une mauvaise idée des services de production, comment puis-je faire cela avec minuteries?

/ mike


1 commentaires

Disent-ils aussi pourquoi thread.sleep est une mauvaise idée?


4 Réponses :


10
votes

Avez-vous essayé de définir la propriété de la minuterie Réinitialiser automatiquement à FALSE et activant la minuterie à nouveau lorsque le processus de rafraîchissement des données est terminé sur

using System;

public class PortChat
{
    public static System.Timers.Timer _timer;
    public static void Main()
    {

        _timer = new System.Timers.Timer();
        _timer.AutoReset = false;
        _timer.Interval = 100;
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
        _timer.Enabled = true;
        Console.ReadKey();
    }

    static void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        //Do database refresh
        _timer.Enabled = true;
    }
}


3 commentaires

Exactement ce que je cherchais. Merci!


Désolé mais ne devrait-il pas être _timer.enabled = false dans l'événement écoulé? Pourquoi est-il défini sur true à nouveau si c'est fait en main?


@Neale, la question initiale était de faire une pause de la boucle jusqu'à ce que quelque chose ne soit pas terminé. Lorsque nous mettons _timer.Authereset = FALSE, la boucle ne se produira qu'une fois après la mise en place de la minuterie. Donc, lorsque notre boucle se termine par la lecture, nous activerons à nouveau la minuterie en l'activant



0
votes

Il n'y a rien de mal à cette approche. Un fil de couchage ne consomme aucun cycles de processeur.

Si vous avez besoin de faire quelque chose exactement toutes les x secondes, une minuterie est la voie à suivre. Si, d'autre part, vous voulez faire une pause pendant x secondes, puis thread.sleep est approprié.


1 commentaires

Un fil de couchage peut ne pas consommer de cycles de processeur mais il faudra consommer de nombreuses ressources de noyau par rapport à l'objet de la minuterie



1
votes

Je ne vois aucun problème d'utilisation de sommeil au tout autre que vous pourriez vous retrouver avec le code laid.

Pour répondre à votre question: P>

public class MyTest
{
    System.Threading.Timer _timer;


    public MyTest()
    {
       _timer = new Timer(WorkMethod, 15000, 15000);
    }


    public void WorkMethod()
    {
       _timer.Change(Timeout.Infinite, Timeout.Infinite); // suspend timer

       // do work

       _timer.Change(15000, 15000); //resume

    }
}


0 commentaires

0
votes

thread.sleep n'est pas mauvais en soi dans un service, juste que vous devez être adapté aux commandes de service, de sorte que votre fil de travail ne devrait pas aller dormir pendant une heure, mais il a plutôt besoin de Dormez pendant de courtes périodes de temps, puis réveillez-vous et écoutez si la partie du contrôleur de service du service lui dit de s'arrêter pour une raison quelconque.

Vous voulez le faire afin que si l'administrateur indique à votre service de s'arrêter, cela cessera assez de manière à ne pas obtenir de messages de délai d'attente où l'administrateur ne peut pas être arrêté et que c'est Sûr pour redémarrer la machine ou similaire.


0 commentaires