J'ai deux alternatives à l'aide de la minuterie ou en utilisant le sommeil, j'ai besoin d'appeler une méthode toutes les 3 secondes après la fin de cette méthode, j'ai écrit des exemples de base pour démontrer ce que je veux dire:
public static void Main() { new Thread(new ThreadStart(fooUsingSleep)).Start(); callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000); } public static void fooUsingSleep() { Console.WriteLine("Doing some consuming time work using sleep"); Thread.Sleep(3000); fooUsingSleep(); } public static void fooUsingTimer(object dummy, ElapsedEventArgs dummyElapsed) { Console.WriteLine("Doing some consuming time work usning timer"); callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000); } public static void callToMethodAfterInterval(Action<object,ElapsedEventArgs> inMethod, int inInterval) { System.Timers.Timer myTimer = new System.Timers.Timer(); myTimer.Elapsed += new ElapsedEventHandler(inMethod); myTimer.Interval = inInterval; myTimer.AutoReset = false; myTimer.Start(); }
3 Réponses :
Dormir fera l'affaire, la minuterie d'autre part a été conçue pour cet objectif exact, les conventions sont meilleures et que vous rendrez généralement votre code plus compréhensible. P>
Comment puis-je écrire la partie de la minuterie plus élégante?
Le vrai contexte de votre programme importe également.
L'option de sommeil "déteste" un thread, pas un problème dans une petite application de console, mais en général pas une bonne idée. P>
Vous n'avez pas besoin de redémarrer la minuterie, ce qui suit continuera à creuser: P>
static void Main(string[] args) { var t = new System.Timers.Timer(1000); t.Elapsed += (s, e) => CallMeBack(); t.Start(); Console.ReadLine(); }
Je noterais que je ne pense pas que c'est exactement ce que l'original était censé faire - il faisait la tâche de fonctionnement à long terme, puis la conviendrait à nouveau 3 secondes après l'achèvement - la vôtre fonctionnera chaque seconde?
@Paddy, à droite, je suppose une tâche relativement courte. L'OP devrait dire.
Je ne veux pas que l'option foo soit appelée avant que les autres appels à FOO aient fini ..
@Delas: une sorte de drapeau de garde serait mieux (si FOO () peut venir même près de 3 secondes).
Son bon pour moi, marque comme réponse, j'ai aussi aimé que vous éliminiez la nécessité de déclarer les variables factices dans la déclaration foo
Réalisez-vous que Si vous utilisez la minuterie, elle peut être aussi simple que ceci: p> FoousingSleep CODE> s'appelle encore et encore? Cela générera éventuellement un débordement de pile.
+1 pour une solution élégante, comment cela causera un débordement de pile? Je ne peux pas le voir, dans votre solution, la méthode peut être appelée avant la fin du dernier et cela peut conduire à des bugs difficiles à trouver, donc cette raison pour laquelle je n'ai pas marqué comme réponse.
Il ne peut pas être appelé avant que le dernier ait fini parce qu'ils fonctionnent sur le même fil. Votre solution (Appeling FoousingSleep () de Inside FoousingSleeP () débordera éventuellement déborder de la pile car sur chaque méthode appeler le contexte d'exécution est poussé sur une pile, qui n'est pas de capacité illimitée)
Ok, maintenant je comprends le débordement de la pile que vous mentionnez :)