2009-05-06 4 views
0

In meiner DoWork() - Funktion registriere ich mit unserem SIP-Server. Dann muss ich auf eine Antwort warten. Die Antwort, die ich bekomme, wird jedoch in einem anderen Ereignis empfangen. Bevor ich jedoch die Flagge im DoWork() überprüfen kann, ist das DoWork() fertig und die Antwort kommt danach.C# Beitritt Threads im Hintergrund Worker DoWork()

Ich versuche einen Weg zu finden, in der DoWork() warten, bis ich eine Antwort in der Diagnoseereignis erhalten. Ich habe ein globales Flag, das in diesem Ereignis gesetzt ist, dass ich das DoWork() einchecken muss.

Vielen Dank für jede Beratung,

// 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

Hallo (1) Was ist das Antwortflag? Und wo ist es wahr? (2) Können Sie die Methode posten, in der Sie den Hintergrundarbeiter tatsächlich verwenden? – Grzenio

+0

Hallo. Die Antwort ist ein SIP-Protokoll mit 600 Benutzern. Wenn es auf "True" gesetzt wurde, wurde ein Benutzer gefunden. Ich habe den Code geändert, damit er einfacher aussieht. Ich denke, dass Scotty die beste Lösung hat. Damit gehe ich jetzt weiter. Ich werde zurückschreiben, wenn ich vollständig abgeschlossen habe. Vielen Dank. – ant2009

Antwort

1

Sie einen ManualResetEvent nutzen könnten. Sobald Ihr Code den WaitOne-Aufruf erreicht, wird er blockiert, bis das Ereignis gesetzt ist. Der WaitOne-Anruf ist ebenfalls überlastet, sodass Sie bei Bedarf eine Wartezeit angeben können.

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(); 
     } 
}