2009-05-06 12 views
0

Dans ma fonction DoWork(), je m'inscris auprès de notre serveur sip. Ensuite, je dois attendre une réponse en retour. Cependant, la réponse que je reçois est reçue dans un autre événement. Cependant, avant que je puisse vérifier le drapeau dans le DoWork() le DoWork() a tout fini prêt et la réponse vient après.C# joignant des threads en arrière-plan worker DoWork()

J'essaie de trouver un moyen d'attendre dans le DoWork() jusqu'à ce que j'obtienne une réponse dans l'événement Diagnotic. J'ai un drapeau global qui est placé dans cet événement que je dois vérifier dans le DoWork().

Merci pour tout conseil,

// Do work in background worker 
//Will return less than 8 if there are no error message from the library 
     if (!this.bgwProcessLogin.CancellationPending) 
     { 
       // Register and wait for response 
       VaxSIPUserAgentOCX.RegisterToProxy(3600); 
     } 
     else 
     { 
       // Update label 
       if (this.lblRegistering.InvokeRequired) 
       { 
        // do something here 
       } 
       else 
       { 
        // Display error 
       } 
     } 

// WAIT FOR A RESPONSE FROM THE DIAGNOTIC EVENT BEFORE CONTINUING - MAYBE JOIN HERE 
     if (!this.bgwProcessLogin.CancellationPending) 
     { 
      if (this.responseFlag) 
      { 
       // Do something here 
      } 
      else 
      { 
       // Do something else here 
      } 
     } 


// Another function where I receive the response 
private void VaxSIPUserAgentOCX_OnIncomingDiagnostic(object sender, AxVAXSIPUSERAGENTOCXLib._DVaxSIPUserAgentOCXEvents_OnIncomingDiagnosticEvent e) 
    { 
     string messageSip = e.msgSIP; 
     //Find this message in the sip header 

     string sipErrorCode = "600 User Found"; 
     if (messageSip.Contains(sipErrorCode)) 
     { 
      // Set global flag for response 
      this.responseFlag = true; 
     } 
} 
+0

Salut (1) Quel est le drapeau de réponse? Et où est-il réglé à vrai? (2) Pourriez-vous publier la méthode dans laquelle vous utilisez réellement l'arrière-plan? – Grzenio

+0

Bonjour. La réponse est un protocole «600 utilisateurs trouvés». Si elle a été définie sur true, un utilisateur a été trouvé. J'ai changé le code pour le rendre plus simple. Je pense que scotty a la meilleure solution. Je vais avec ça pour le moment. Je posterai à nouveau quand je l'aurai complètement terminé. Merci. – ant2009

Répondre

1

Vous pouvez utiliser un ManualResetEvent. Une fois que votre code atteint l'appel WaitOne, il bloquera jusqu'à ce que l'événement soit défini. L'appel WaitOne est également surchargé, de sorte que vous pouvez prévoir une durée d'attente si nécessaire.

void SomeFunction() 
{ 
// Do work in background worker 
//Will return less than 8 if there are no error message from the library 
     if (!this.bgwProcessLogin.CancellationPending) 
     { 
       // Register and wait for response 
       VaxSIPUserAgentOCX.RegisterToProxy(3600); 
     } 
     else 
     { 
       // Update label 
       if (this.lblRegistering.InvokeRequired) 
       { 
        // do something here 
       } 
       else 
       { 
        // Display error 
       } 
     } 

// WAIT FOR A RESPONSE FROM THE DIAGNOTIC EVENT BEFORE CONTINUING - MAYBE JOIN HERE 

     waitEvent.WaitOne(); 
     if (!this.bgwProcessLogin.CancellationPending) 
     { 
      if (this.responseFlag) 
      { 
       // Do something here 
      } 
      else 
      { 
       // Do something else here 
      } 
     } 
} 

ManualResetEvent waitEvent = new ManualResetEvent(false); 

// Another function where I receive the response 
private void VaxSIPUserAgentOCX_OnIncomingDiagnostic(object sender, AxVAXSIPUSERAGENTOCXLib._DVaxSIPUserAgentOCXEvents_OnIncomingDiagnosticEvent e) 
    { 
     string messageSip = e.msgSIP; 
     //Find this message in the sip header 

     string sipErrorCode = "600 User Found"; 
     if (messageSip.Contains(sipErrorCode)) 
     { 
      // Set global flag for response 
      this.responseFlag = true; 
      waitEvent.Set(); 
     } 
}