2009-05-06 8 views
0

私のDoWork()関数では、私たちのSIPサーバに登録します。その後、私は応答を待つ必要があります。しかし、私が得た応答は別のイベントで受信されます。しかし、DoWork()のフラグをチェックする前に、DoWork()はすべて準備ができており、応答は後に来ます。バックグラウンドでスレッドを結合するC#DoWork()

診断イベントで応答が得られるまで、DoWork()で待機する方法を見つけようとしています。私はそのイベントで設定されているグローバルフラグを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

+0

こんにちは。応答は '600 user found' sipプロトコルです。 trueに設定されている場合、ユーザーが見つかりました。もっとシンプルに見せるためにコードを変更しました。私はscottyが最高の解決策を持っていると思う。私は今のところそれに行く。私は完全に完了したときに私はポストバックします。ありがとう。 – ant2009

答えて

1

あなたはManualResetEventを使用することができます。コードがWaitOneコールにヒットすると、イベントがSetになるまでブロックされます。 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(); 
     } 
} 
関連する問題