0
votes

Conserver les valeurs variables lors de l'exécution de 2 tâches ou plus en parallèle

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: xxx pré>

Ce qui suit est la classe myreference: p>

public class MyReference()
{
    public string Id {get;set;}
    public string FullName {get;set;}
}


16 commentaires

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 , qui restent actives actives, causant des fuites. Qu'essayez-vous de faire? Quel est le problème réel que vous voulez résoudre? Pourquoi ne pas utiliser par exemple task.delay 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 . Vous pouvez créer la minuterie une seule fois dans le constructeur, stockez-la dans un champ et appelez simplement start () dans le gestionnaire de clic si vous le souhaitez que cela vous incombe une fois


Si 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 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 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é . Créez un nouveau et tout va fonctionner. somereference = nouvelle myreference (); comme première ligne dans enregistré .


Pourriez-vous ajouter une méthode clone < / a> dans la classe myreference , de sorte que vous puissiez créer un clone de l'instance somereference chaque fois que le bouton est cliqué sur le bouton? Cette méthode devrait créer une nouvelle instance MyreFerence et copier toutes les données importantes de l'objet d'origine sur le clone, puis renvoyez le clone.


3 Réponses :



0
votes

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> xxx pré>

lorsque quelqu'un clique sur quelque chose, p> xxx pré>

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);
    }
};


0 commentaires

2
votes

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 somerefenceference pointera toujours simplement sur un emplacement de mémoire où votre MyreFerence 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 et l'envoyer.

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 Save () appel.

Pour implémenter cela, vous pouvez (il y a beaucoup d'autres méthodes) utilisez le Interface ICLONABLE comme ceci: xxx

MAINTENANT Lorsque vous cliquez sur le bouton Vous pouvez utiliser Theodors Task.Delay et lui donner une copie de votre objet: xxx


0 commentaires