2010-08-16 10 views
0

VERSION RÉSOLUÉcoute asynchrone sur la classe qui a lancé le processus asynchrone

Ok, donc c'est ici. Je ne suis même pas sûr de savoir comment poser correctement la question. Je crée un formulaire qui apparaît de manière asynchrone dans un programme afin qu'il n'interfère pas avec le programme principal. Dans ce formulaire, je veux afficher les données provenant de la "classe de base", dans cet exemple, c'est la classe Metronome. La classe Metronome est également la même classe qui a lancé le formulaire de manière asynchrone. Je n'arrive pas à comprendre comment faire ceci ou si c'est même possible. J'ai regardé divers tutoriels et n'arrive pas à le faire fonctionner. Toute aide serait grandement appréciée.

Voici mon code:

using System; 

namespace Project2 
{ 
    public class TimeOfTick : EventArgs 
    { 
     private DateTime TimeNow; 
     public DateTime Time 
     { 
      set 
      { 
       TimeNow = value; 
      } 
      get 
      { 
       return this.TimeNow; 
      } 
     } 
    } 

    public class Metronome 
    { 
     public event TickHandler Tick; 
     public delegate void TickHandler(Metronome m, TimeOfTick e); 

     public delegate void ListenerDelegate(); 
     public static void myCallback(IAsyncResult result) 
     { 
      ListenerDelegate del = (ListenerDelegate)result.AsyncState; 
      del.EndInvoke(result); 
     } 

     public void MetronomeStarter() 
     { 
      Listener listen = new Listener(); 
      listen.MetronomeItem = this; 
      ListenerDelegate del = new ListenerDelegate(listen.Starter); 
      del.BeginInvoke(myCallback, del); 
     } 

     public void Start() 
     { 
      while (true) 
      { 
       System.Threading.Thread.Sleep(3000); 
       if (Tick != null) 
       { 
        TimeOfTick TOT = new TimeOfTick(); 
        TOT.Time = DateTime.Now; 
        Tick(this, TOT); 
       } 
      } 
     } 
    } 

    public class Listener 
    { 
     private Metronome metronomeItem; 
     public Metronome MetronomeItem 
     { 
      get { return metronomeItem; } 
      set { metronomeItem = value; } 
     } 

     public void Starter() 
     { 
      Console.WriteLine("Starting Listener class");   
      metronomeItem.Tick += new Metronome.TickHandler(HeardIt);    
     } 

     void HeardIt(Metronome m, TimeOfTick e) 
     { 
      System.Console.WriteLine("HEARD IT AT {0}", e.Time); 
     } 

    } 

    class Test 
    { 
     static void Main() 
     { 
      Metronome m = new Metronome();    
      m.MetronomeStarter(); 
      m.Start(); 
     } 
    } 
} 

Répondre

0

Faire une propriété publique Métronome au sein de votre classe Listener et définissez cette propriété à « ce » dans votre méthode MetronomeStarter. Cela vous donnera un accès complet dans la classe Listener à tout dans l'objet Metronome qui a instancié l'objet Listener.

public void MetronomeStarter() 
     { 
      Listener listen = new Listener(); 
      listen.MetronomeItem = this; 
      ListenerDelegate del = new ListenerDelegate(listen.Starter); 
      del.BeginInvoke(myCallback, del); 
     } 
+0

Comment faites-vous exactement cela ?? Je suis un peu nouveau pour C# et je n'ai pas vraiment compris ce que vous avez dit. Merci pour l'aide!! –

+0

Et la propriété Metronome? :-) Est-ce le type get/set? –

+0

Dans votre classe de programme d'écoute, remplacez le champ "m" par une propriété: si vous l'appelez MetronomeItem au lieu de "m", rendez-le public avec un get et un set, le code fonctionnera comme vous le souhaitez. échantillon que j'ai fourni .. – Russ