2009-05-06 2 views
0

В моей функции DoWork() я регистрируюсь на нашем sip-сервере. Тогда я должен ждать ответа. Однако ответ, который я получаю, получен в другом случае. Однако, прежде чем я смогу проверить флаг в DoWork(), DoWork() имеет все готовое завершение и ответ приходит после.C# присоединение потоков в фоновом рабочем документе DoWork()

Я пытаюсь найти способ подождать в DoWork(), пока не получаю ответ в событии Diagnotic. У меня есть глобальный флаг, установленный в этом событии, который я должен проверить в DoWork().

Спасибо за любые советы,

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

Hi (1) Что такое ответный флаг? И где он установлен в true? (2) Не могли бы вы опубликовать метод, в котором вы фактически используете фонового работника? – Grzenio

+0

Привет. Ответ - это протокол sip, который был найден «600 пользователей». Если оно установлено в true, пользователь был найден. Я изменил код, чтобы сделать его более простым. Я думаю, что у scotty есть лучшее решение. На данный момент я собираюсь. Я отправлю обратно, когда полностью закончу. Благодарю. – ant2009

ответ

1

Вы можете использовать ManualResetEvent. Как только ваш код попадет на вызов WaitOne, он будет блокироваться до тех пор, пока событие не будет установлено. Вызов WaitOne также перегружен, поэтому вы можете предоставить продолжительность ожидания, если вам нужно.

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(); 
     } 
} 
Смежные вопросы