1

Bonjour ouais je pose cette question une deuxième fois, désolé à ce sujet mais je ne sais pas comment bosse précédente question. Je vais expliquer plus en profondeur mon problème dans un exemple plus complet. Au lieu d'écrire comme 300+ classes d'événements dans 300 fichiers de classe que je devrais faire si cela ne fonctionne pas, afin qu'ils puissent faire de petits travaux chronométrés comme cet exemple de travail ci-dessous dans un projet de serveur. Ce que j'essaie d'éviter, c'est d'écrire un tas de classes et d'écrire tout simplement plus compact dans la structure de tout ce sur quoi je travaille. Pour résumer, je mélange 90% de la programmation fonctionnelle et je veux donner une fonction à un événement temporisé différé, sans créer le nouvel événement chronométré dans une classe séparée puis aller et venir dans les fichiers en regardant comment tout est connecté, mais de cette façon tout peut être vu de sorte que vous pouvez trouver des bugs et ce n'est pas beaucoup plus rapide que tout est en face de vous, un peu comme l'écriture de code de boucle, mais avec retard. Tout ce que j'ai en ce moment, c'est un fil qui traite les événements, supprime les événements qui ont été arrêtés, continue à relancer les événements qui ne s'arrêtent pas après un cycle et bien sûr attendre que certains événements puissent être courus.C# S'abonner méthode dynamiquement anonyme

Si quelqu'un connaît une meilleure façon de faire ce que j'essaie de faire peut-être un système C# Event intégré? Ce qui est de préférence simple.

class Event { 
    private Action action; 
    private bool stopped; 

    public Event(long tick, Action action) { 
     this.tick = tick; 
     this.action = action; 
     this.lastRun = Environment.TickCount; 
    } 

    public void stop() { 
     stopped = true; 
    } 

    public bool canRun() { //blah ignore just showing what I plan to do 
     if (stopped) 
      return false; 
     return (Environment.TickCount - lastRun) > tick; 
    } 

    public void run() { 
      this.lastRun = Environment.TickCount; 
     action(); 
    } 

    //... other methods 
} 

 

class Test { 
    string t; 

    public void setT(string t) { 
     this.t = t; 
    } 

    public void stuff() { 
     Console.WriteLine(a); 
    } 
} 

 

class ImportantWork { 

    public static void Main(string[] args) { 
     someDeepMethod(); 
    } 

    void someDeepMethod() { 
     Test t = new Test(); 
     t.setT("secondTime"); 

     //Here is where the problem occurs. 

     Server.registerEvent(new Event(5000,() => { 
        this.stop(); //<-- Error how I call this from this new Event instance. 
        stop(); //<-- Also error 
        //Event.stop(); //<-- haha may work if it was static but thats stupid 
        t.stuff(); 
        Console.WriteLine("thirdTime"); 
     })); 

     t.setT("firstTime"); 
     t.stuff(); 
    } 
} 

Sortie prévue:
firstTime
... attend 5 secondes ...
secondTime
thirdTime

+0

ne s'arrêterait pas simplement(); travail? –

+1

Le nom 'stop' n'existe pas dans le contexte actuel. (enlever ça ne change rien) – SSpoke

Répondre

1

Je ne sais pas comment vous seriez en mesure de le faire en ligne comme ça. Pourquoi ne pouvez-vous pas utiliser une sorte de fonction-set et en faire deux lignes? Il me semble qu'il y a une sorte de problème structurel avec votre conception. Je suppose que l'exemple que vous avez donné n'était pas vraiment ce que vous utilisiez, juste un exemple simple pour résoudre le problème que vous rencontrez. Cependant, si c'est l'exemple avec lequel vous travaillez, pourquoi ne pas simplement ajouter un indicateur booléen dans le constructeur pour indiquer à l'instance si elle doit ou non appeler this.stop() sur elle-même - au lieu de l'exiger dans le Action?

Bonne chance!

+0

hey c'est pas trop mal, n'y pense pas comme ça! lol – SSpoke

+0

Hehehe. Pas de problème. Oui, je ne connais aucun moyen de référencer une instance non encore créée dans ses paramètres constructeurs. –

+0

Merci mrazza .. ce n'est pas tant un problème structurel qu'une opération forcée .. certains événements .. doivent continuer à courir des intervalles beaucoup plus longs non seulement 5 secondes et disposer des événements .. mais peut-être 5 fois .. alors disposer .. Dans le exemple ci-dessus .. Je l'exécute seulement une fois ..dans d'autres cas, je ne devrais même pas inclure stop(); (ne pas dire ceux que je n'inclus pas stop() sont pour toujours .. il y aura des instructions conditionnelles pour appeler stop() dans d'autres événements) – SSpoke