Que faire si une minuterie ne peut pas terminer l'ensemble de ses oeuvres avant le nouveau cycle arrive l'heure?
Supposons que nous avons une minuterie qui passe toutes les 10 minutes. Que faire si le cycle de son traitement dure plus de 10 minutes. Un nouveau thread démarre pour qui? Il va interrompre l'opération en cours? Que faire si un seul objet est muté à l'intérieur de la minuterie?
Désolé si je ne parle pas de n'importe quel code pour cette raison, le problème est clair et aussi je veux savoir la réponse complète à partir du point de vue d'un multi-thread de programmation geek plutôt que de trouver un lâche réponse en essayant de le tester via un exemple d'application. En fait, je veux savoir la logique derrière son mécanisme de fonctionnement.
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez
System.Threading.Timer
ouSystem.Timers.Timer
, la minuterie tique encore une fois, commencer un nouveau thread. Voir https://stackoverflow.com/a/10442117/56778 un moyen d'éviter ce problème.Si vous utilisez
System.Windows.Forms.Timer
, puis un nouveau tique ne se produira pas jusqu'à ce que le précédent est terminé le traitement.Mettre votre code dans un
Monitor.TryEnter()
TryEnter
n'ayant pas le temps d'intervalle du paramètre, ou avec un intervalle de temps zéro, bloque jamais (Voir "Remarques" dans la doc).pour empêcher la réentrée, vous pouvez utiliser un static boolean qui indique si la fonction est déjà être exécuté. L'utilisateur d'un try/Catch/finally et de définir cette valeur à false dans le enfin pour s'assurer que le booléen ne reste pas faux si vous avez fait une erreur dans le code ou si le code a échoué.
Pour une plus rapide de la minuterie, la réentrance devraient être évités par l'utilisation de sémaphore (mutex).
Sleep
doit être évitée, pas recommandé], mais après avoir lu attentivement sa réponse ailleurs, je ne le recommande (mais voir mon changement recommandé dans un commentaire).