Réinitialiser Le Système.Les minuteries.À rebours pour éviter événement Écoulé
Je suis en train d'utiliser le Timer
pour déclencher un événement pour envoyer des données à travers le réseau. J'ai créé une classe simple pour déboguer. Fondamentalement, j'ai un List<string>
je voudrais envoyer. Je veux la suite:
- Ajouter une chaîne à
List
- Commencer
Timer
pendant 10 secondes - Ajouter la deuxième chaîne de
List
avantTimer.Elapsed
- Redémarrer
Timer
de 10 secondes.
Pour l'instant j'ai ceci:
public static List<string> list;
public static Timer timer;
public static bool isWiredUp = false;
public static void Log(string value) {
if (list == null) list = new List<string>();
list.Add(value);
//this does not reset the timer, elapsed still happens 10s after #1
if (timer != null) {
timer = null;
}
timer = new Timer(10000);
timer.Start();
timer.Enabled = true;
timer.AutoReset = false;
if (!isWiredUp) {
timer.Elapsed += new ElapsedEventHandler(SendToServer);
isWiredUp = true;
}
}
static void SendToServer(object sender, ElapsedEventArgs e) {
timer.Enabled = false;
timer.Stop();
}
Des idées?
OriginalL'auteur tedski | 2013-02-13
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
Stop
fonction immédiatement suivi par leStart
la fonction "redémarrage" de la minuterie. L'aide que vous pouvez créer leTimer
lorsque la classe est d'abord créé, le fil de l'événement Écoulé à l'époque, et puis ne rien faire, mais l'appel de ces deux méthodes lorsqu'un élément est ajouté. Il va démarrer ou redémarrer la minuterie. Noter que l'appelStop
sur une minuterie qui n'a pas encore été commencé juste ne fait rien, il ne lance pas d'exception ou de causer d'autres problèmes.Note que, plutôt que d'utiliser un
List
il est très possible que vous souhaitez utiliser unBlockingCollection<string>
à la place. Cela a plusieurs avantages. Tout d'abord, leLog
méthodes de travail si on l'appelle en même temps à partir de plusieurs threads; est simultané de plusieurs journaux pourraient briser la liste. Cela signifie également queSendToServer
pouvez prendre tous les éléments de la file d'attente en même temps que de nouveaux éléments sont ajoutés. Si vous utilisez unList
vous aurez besoin delock
tous les accès à la liste (ce qui pourrait ne pas être un problème, mais n'est pas aussi simple).C'est exactement comment je l'ai lu. C'est exactement ce que ce code ne.
même en utilisant une minuterie.. c'est une mauvaise idée.. Il n'y a pas de blocage, pas de forme de synchronisation.. Une minuterie est absolue la pire façon de faire cela, il doit reconsidérer la manière dont il est la résolution de ce problème.
Le seul problème, c'est quand le
Start()
fonction est appelée une deuxième fois, il ne veut pas retarder leElapsed
événement.La synchronisation doit être fait pour utiliser un Timer, et c'est toute une question distincte de la question à portée de main. Oui, il doit d'aborder cette question, mais ce n'est pas ce que la question se pose au sujet de.
OriginalL'auteur Servy
Ce genre de chose est très facile à réaliser avec IObservable (Rx).
Laissez-nous simplifier les choses en déclarant un
Subject<string>
que votre liste afin de la pousser sur l'aide .OnNext. Une fois que vous avez votre sujet, un fait observable, vous pouvez faire ce que vous voulez avec une seule "ligne" du Système.Réactive.Linq. Ceci est illustré dans le pseudo-c#OriginalL'auteur Sentinel
Ce que vous êtes à la mise en œuvre est totalement de mauvaise façon de faire. Jetez un oeil à la consommation producteur modèle:
http://msdn.microsoft.com/en-us/library/hh228601.aspx
Ce que vous essayez de faire est très communément appelé le Consommateur/Producteur de flux de données modèle. Essentiellement, vous avez quelque chose de la génération d'une liste de données qui est envoyé quelque part, plutôt que de l'envoyer à chaque fois qu'un élément est ajouté à la liste que vous voulez pour les envoyer dans des groupes.. Si vous avez un producteur (le code en mettant l'envoi de données) et un consommateur (le code de l'envoi des données).
En général, ce problème est résolu en créant un thread qui regarde la liste (généralement une file d'attente) et envoie les données à régulièrement des intervalles, la meilleure façon de le faire est d'utiliser un EventWaitHandle.
Ici est très simplifié le code comme un exemple
Je n'ai aucune idée de ce que vous dites ou ce que la page est censée être de me dire
ok je vais modifier et d'expliquer plus...
1. Si vous n'avez pas le réinitialiser, et ont
AutoReset=true
, la même chose. Quand il n'est pas mis à réinitialisation automatique et est réinitialisé lorsqu'un élément est ajouté, quelque chose de tout à fait différent. 2. Puis ajouter en sorte que votre code ne ce que la question demande. 3. Non, il n'est pas. Si vous voulez la preuve, lisez votre propre lien, il recommande une approche très différente. 4. Non, c'est pas la meilleure utilisation des ressources, il brûle un thread dédié inutilement. Peut-être vous devrait lire votre propre lien. Il semble que vous êtes en train de penser sur le premier lien que vous avez posté marqué "obsolète". Cela devrait vous donner un indice. Comment est l'utilisation d'un minuteur, une erreur?Je trouve ça un peu drôle que vous le downvote ma réponse, malgré le fait que cela fonctionne, parce que je downvoted votre réponse, car elle ne pas de travail.
OriginalL'auteur Matthew Sanford