2010-10-12 4 views
2

Je suis un peu nouveau pour C# et la programmation multithread en général, mais ici va:C# passer des messages entre les classes

Je travaille sur un système où j'aurais une classe qui serait instancié puis attendre divers messages d'une autre classe en cours d'exécution. Comment dois-je faire pour attraper et envoyer ces messages?

Merci,

PM

Répondre

3

si vous ne l'utilisez .net Remoting pour envoyer l'objet entre les différents domaines d'application .

en scenarion simple:

1- Créer un objet singleton de votre classe de maître.

2- Utilisez Evénement et Déléguer pour envoyer les messages entre les classes.

Si vous devez envoyer les messages entre Appdomains.

1- Si la appdomain ne boundry que la machine croisée utiliser le canal IPC (.Net 2.0 et versions ultérieures)

2- Si appdomain traverse la machine boundry que, vous pouvez utiliser .net Remoting.

2

Utilisez une file d'attente Producer/Consumer. Il existe une implémentation par défaut dans .NET 4.0 et il existe de nombreux exemples d'implémentations trouvées sur le net. Ce que vous voulez, en fonction de ce que vous décrivez, est une file d'attente mono-producteur/consommateur unique.

En règle générale, un thread est considéré comme un producteur et écrit des messages dans une file d'attente. Un thread distinct, appelé thread consommateur, attend inactif que les messages apparaissent dans la file d'attente. Les détails de synchronisation sur la façon dont ces threads coopèrent (ou non) entre eux dépendent de l'implémentation.

2

Si vous utilisez .Net 3.5, exécutez votre expéditeur dans un thread séparé et transmettre une méthode de rappel de l'auditeur:

class Program 
    { 
     static void Main(string[] args) 
     { 
      Listener listener = new Listener(); 
      Sender sender = new Sender(); 
      sender.Send = new TalkDelegate(listener.TalkToMe); 
      Thread thread = new Thread(sender.Run); 
      thread.IsBackground = true; 
      thread.Start(); 
      listener.Listen(); 
     } 
    } 

    delegate bool TalkDelegate(string messageArg); 

    class Listener 
    { 
     bool keepListening = true; 

     public bool TalkToMe(string messageArg) 
     { 
      Console.WriteLine(messageArg); 
      return keepListening; 
     } 

     public void Listen() 
     { 
      DateTime startTime = DateTime.Now; 
      while ((DateTime.Now - startTime) < TimeSpan.FromSeconds(10)) 
      { 
       Thread.Sleep(100); 
      } 
      keepListening = false; 
     } 
    } 

    class Sender 
    { 
     public TalkDelegate Send; 

     public void Run() 
     { 
      bool keepTalking = true; 
      while (keepTalking) 
      { 
       keepTalking = Send(DateTime.Now.ToString("HH:mm:ss")); 
       Thread.Sleep(1000); 
      } 
     } 
    } 
Questions connexes