2013-08-16 3 views
0

Permettez-moi de peindre ma situation:Attendre le thread qui crée une instance qui crée un thread

J'ai un serveur WCF qui crée un thread. Ce thread exécute un assembly, appelons-le ABC.exe. Ce ABC.exe ce que cela:

static void Main(string[] args) 
    { 
     objClientBase.OnHandshakeCompleted += new EventHandler(objClientBase_OnHandshakeCompleted); 
     objClientBase.OnShutdownInitiated += new EventHandler(objClientBase_OnShutdownInitiated); 
     objClientBase.Connect(); 
     objOEEMon = new Main(); 
     System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); 
    } 

Connect fait:

 objClientThread = new Thread(start) { IsBackground = true }; 
     objClientThread.Start(); 

Et start

/// <summary> 
    /// Starts the client program. 
    /// </summary> 
    private void start() 
    { 
      //We Open the proxy to let connections happen 
      objProxy.Open(); 
      if (performHandshake()) 
      { 
       IsConnected = true; 
       DelayedShutdownBool = false; 
       //While connected, the thread keeps the client alive 
       while (IsConnected) 
       { 
        System.Threading.Thread.Sleep(500); 
        if (DelayedShutdownBool) 
        { 
         System.Threading.Thread.Sleep(500); 
         objProxy.Close(); 
         objConfiguration = null; 
         IsConnected = false; 
        } 
       } 
      } 
    } 

ce ABC.exe est le client qui se connecte au serveur avec WCF.

Ainsi, au lieu d'avoir la Sleep(Infinite) que je veux utiliser manualResetEvent s (ou autre chose) de sorte que le Main() est notifié sur l'extrémité du fil qui Connect marques et mettre fin à son exécution aussi. Mais je ne sais pas comment le Main peut être averti, car il appelle une fonction d'une instance qui crée un thread.

Ce que je ne veux pas est une attente active où il y a un while(condition) sleep

+1

Pourquoi enfilez-vous du tout dans ce projet ABC? Le thread principal attend seulement l'autre. –

+1

Vous avez plusieurs 'Sleep()' s. Considérez chacun un défaut de conception. –

+0

Il est déjà conçu comme ça, je dois juste changer le sleep.infinite et le faire attendre jusqu'à ce que le thread créé avec la connexion se termine. – AAlferez

Répondre

1

ma faute ... Je passais une nouvelle instance de ma classe au lieu de en cours, mon rappel a été fait à une autre instance et donc les variables modifiées n'étaient pas les bonnes.

Fonctionne parfaitement maintenant. Merci pour les réponses, ils m'ont aidé à réfléchir à la séquence pour réfléchir à l'erreur.

0

Une solution pourrait être d'utiliser Task classe au lieu de créer explicitement le Thread

//here instead of creating a Thread, create a Task and return it to the caller 
objClientThread = new Thread(start) { IsBackground = true }; 
objClientThread.Start(); 

Ensuite, vous pouvez faire

Task task = objClientBase.Connect(); 
task.Wait(); 
+0

objClientBase.Connect() crée un thread mais ne renvoie pas le thread. Besoin de garder les threads au lieu de tâche désolé – AAlferez

0

Si vous souhaitez utiliser un événement de réinitialisation manuelle, procédez comme suit, déclarez une nouvelle réinitialisation. nt:

private static ManualResetEvent finished = new ManualResetEvent(false); 

Attendez l'événement:

 //We Open the proxy to let connections happen 
     objProxy.Open(); 
     if (performHandshake()) 
     { 
      IsConnected = true; 
      DelayedShutdownBool = false; 
      //While connected, the thread keeps the client alive 
      finished.WaitOne(); 
      if (DelayedShutdownBool) 
      { 
       System.Threading.Thread.Sleep(500); 
       objProxy.Close(); 
       objConfiguration = null; 
       IsConnected = false; 
      } 
     } 

Et puis dans objClientBase_OnShutdownInitiated:

finished.Set(); 
+0

Ce n'est pas le fil qui doit attendre. Celui qui a besoin de WaitOne serait le 'Principal ', mais alors le problème est, comment puis-je faire' Set' dans l'instance 'objClientBase'? – AAlferez

+0

Tout d'abord vous n'avez pas besoin de dormir ou d'attendre dans le thread principal que le processus restera en vie tant qu'il y a un thread qui est en vie. Deuxièmement, vous devriez signaler l'ensemble depuis ObjClientBase - il y a déjà un bon événement qui notifie quand il s'arrête. – Slugart

+0

Faux, Si je ne l'ai pas (dors ou attends à la fin), mon programme principal atteint la fin et meurt. Je veux dire oui, j'ai aussi un booléen appelé 'IsConnected' que je peux vérifier mais je n'ai pas de temps (IsConnected) à dormir. Je ne veux pas dort là-bas. Le problème est que je ne peux pas accéder à une valeur de l'événement de réinitialisation manuelle pour le définir dans l'instance clientbase. – AAlferez

Questions connexes