2009-05-06 72 views
0

在我的DoWork()函數中,我向我們的sip服務器註冊。然後我必須等待回覆。但是,我收到的回覆是在另一個事件中收到的。但是,在我能夠檢查DoWork()中的標誌之前,DoWork()已經完成並且響應已經完成。C#加入後臺工作線程中的線程DoWork()

我試圖找到一種方法,在DoWork()中等待,直到我在Diagnosis事件中得到響應。我有一個全局標誌,在那個事件中我必須檢查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

嗨(1)什麼是響應標誌?它在哪裏設置爲真? (2)你可以發佈你實際使用後臺工作的方法嗎? – Grzenio 2009-05-06 14:42:34

+0

你好。響應是'600用戶找到'sip協議。如果它已被設置爲true,則找到用戶。我確實改變了代碼,使它看起來更簡單。我認爲斯科蒂有最好的解決方案。我現在就這樣做。完成後我會回覆。謝謝。 – ant2009 2009-05-06 16:57:56

回答

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