Je travaille avec les minuteries et j'ai mis en œuvre un filetage comme premier pas dans la résolution de mon problème. Je dois envoyer une certaine référence toutes les 30 secondes et cette référence est créée à chaque fois qu'un bouton est cliqué. Donc, j'ai le code suivant: Ce qui suit est la classe myreference: p> public class MyReference()
{
public string Id {get;set;}
public string FullName {get;set;}
}
3 Réponses :
Voici comment vous pouvez démarrer une tâche qui enverra une référence avec un délai de 30 secondes, chaque fois que le bouton est cliqué. En cas d'exception, l'exception sera avalé. p> p>
@TheProgrammingNoob Votre problème est probablement lié au champ somerefence code>. J'ai mis à jour ma réponse afin qu'une copie du champ soit stockée localement.
J'ai essayé votre code mais le problème est toujours là. Il n'envoie que les dernières valeurs de la localCopyoftheenceference.
HM, le somerefence code> est une partie cruciale de votre problème alors. Vous devriez probablement mettre à jour votre question en incluant la définition de ce champ et avec le code qui lui donne sa valeur.
Ok, je le ferai. Merci!
J'ai voté cette réponse +1 pour la tâche.Delay est l'approche la plus facile de remplir le minuteur de 30 secondes. Merci pour ça.
Yeap, Tâche.Delay Code> est une petite méthode pratique!
Maintenir toutes ces minuteries semble vraiment déroutant.
Pourquoi ne pas simplement conserver une liste de fois où vous voulez que l'événement se produise? Et rendre l'événement un délégué. P> lorsque quelqu'un clique sur quelque chose, p> dans le gestionnaire, assurez-vous qu'il n'y a pas 'T un événement ultérieur. p> timer.Elapsed += (s,e) => {
var list = events.Where( item => item.Key <= DateTime.Now ).ToList();
foreach (var item in list)
{
item.Value.Invoke();
events.TryRemove(item);
}
};
Il semble que vous ayez besoin d'un clone profond de votre objet.
Permettez-moi d'expliquer pourquoi Une référence à votre objet ne suffit pas.
La variable code> somerefenceference code> pointera toujours simplement sur un emplacement de mémoire où votre La mise en œuvre d'une copie profonde copiera physiquement votre instance en mémoire afin que vous gardes une copie de votre instance. L'objet qui peut être utilisé pour envoyer sans être écrasé à partir de votre Pour implémenter cela, vous pouvez (il y a beaucoup d'autres méthodes) utilisez le MAINTENANT Lorsque vous cliquez sur le bouton Vous pouvez utiliser Theodors MyreFerence code> est situé. Si vous cliquez sur votre bouton, ces données sont écrites / écrasées. Lorsque vos minuteries tire, il chargera toujours toutes les données situées à somerefenceference code> et l'envoyer. P> Save () code> appel. p> Interface ICLONABLE code> comme ceci: p> Task.Delay Code> et lui donner une copie de votre objet: p>
Pourquoi arrêtez-vous la minuterie après qu'il s'écoule? Cela ne fait-il pas que la minuterie elle-même obsolète car chaque minuterie créée ne fonctionne qu'une fois jusqu'à ce qu'elle soit arrêtée?
System.Timers.Timer est déjà exécuté sur un fil différent. Le code posté ici crée plusieurs minuteries de pompiers de plusieurs i>, qui restent actives actives, causant des fuites. Qu'essayez-vous de faire? Quel est le problème réel i> que vous voulez résoudre? Pourquoi ne pas utiliser par exemple
task.delay code> pour ajouter un délai au bouton Action? Si vous souhaitez réinitialiser la minuterie à chaque clic, vous pouvez arrêter et recommencer.@ROBINB Je m'arrête de manière à ce qu'il ne s'échappe qu'une seule fois. Si cela ne sera pas arrêté, il exécutera l'effondrement après 30 secondes.
La seule chose qui est certaine ici est que le fil n'est pas nécessaire.
@TheProgrammingNoob non, le comportement par défaut de System.threading.Timer est de tirer une seule fois sur un thread distinct i>. Vous pouvez créer la minuterie une seule fois dans le constructeur, stockez-la dans un champ et appelez simplement
start () code> dans le gestionnaire de clic si vous le souhaitez que cela vous incombe une foisSi l'utilisateur clique sur une fois le bouton, que devriez-vous arriver? Si l'utilisateur clique sur plusieurs fois le bouton, que devriez-vous arriver alors?
@Theodorzoulias Si l'utilisateur clique sur le bouton une fois, il attendra 30 secondes pour envoyer la référence. Si cela clique sur le bouton plusieurs fois, il convient de créer une référence créée à 30 secondes avant l'envoi.
Donc, chaque fois que l'utilisateur clique sur le bouton, une référence doit être envoyée avec un délai de 30 secondes, correct?
@Theodorzoulias Oui
On dirait que vous avez besoin de la file d'attente et de la minuterie unique, mais ce n'est pas clair ce qui est attendu du comportement lorsque le bouton est spammé.
@Sinatrice Oui, si le bouton est spammé, il fera la queue tout créé
somerefenceference code> et tient chacun d'entre eux 30 secondes après la création et enverra chacun ensuite.Ne devriez-vous pas créer un
somerefenceference code> chaque fois que le bouton est cliqué? Comment cet objet est-il créé?@Theodorzoulias J'ai déjà ajouté le code sur la façon dont je crée ma soménéférement.
@Theodorzoulias J'ai fait une autre modification pour souligner que cela ne devrait être envoyé que s'il est déjà enregistré dans la DB.
Vous militatez l'objet dans
enregistré code>. Créez un nouveau et tout va fonctionner.somereference = nouvelle myreference (); code> comme première ligne dansenregistré code>.Pourriez-vous ajouter une méthode
clone code> < / a> dans la classe code> myreference code>, de sorte que vous puissiez créer un clone de l'instancesomereference code> chaque fois que le bouton est cliqué sur le bouton? Cette méthode devrait créer une nouvelle instance code> MyreFerence code> et copier toutes les données importantes de l'objet d'origine sur le clone, puis renvoyez le clone.