2009-05-16 19 views
0

C#2005AutoResetEventを使用した呼び出し例外

一部のログイン情報を処理するためにバックグラウンドワーカーを使用しています。しかし、バックグラウンドワーカーは、2つのイベントが発生するのを待って停止する必要があります。これらが完了すると、バックグラウンドワーカーは仕事を完了することができます。 AutoResetEventのSet()メソッドを呼び出すコールバックです。

私はこれら2つのイベントが完了したときにAutoResetEventを使用して設定します。しかし、私はこのエラーメッセージが表示されているようです: "例外は呼び出しのターゲットによってスローされました。"

および内部例外 インデックスが範囲外です。負でなく、コレクションのサイズより小さくなければなりません。パラメータ名:インデックス」登録成功は、スコープを離れるとき

例外は通常、発射何かアドバイス

バックグラウンドワーカーのためのコードの

感謝を

// Waiting for 'Account in use' and 'Register success or failure' 
AutoResetEvent[] loginWaitEvents = new AutoResetEvent[] 
{ 
     new AutoResetEvent(false), 
     new AutoResetEvent(false) 
}; 

private void bgwProcessLogin_DoWork(object sender, DoWorkEventArgs e) 
{ 
     Console.WriteLine("Wait until event is set or timeout"); 
     loginWaitEvents[0].WaitOne(3000, true); 

     if (this.accountInUseFlag) 
     { 
       if (this.lblRegistering.InvokeRequired) 
       { 
        ///this.lblRegistering.Invoke(new UpdateRegisterLabelDelegate(this.UpdateRegisterLabel), "Account in use"); 
       } 
       else 
       { 
        ///this.lblRegistering.Text = "Account in use"; 
       } 
       // Failed attemp 
       e.Cancel = true; 
       // Reset flag 
       //this.accountInUseFlag = false; 
       return; 
     } 
     else 
     { 
       // Report current progress 
       //this.bgwProcessLogin.ReportProgress(7, "Account accepted"); 
     } 

     Console.WriteLine("Just Wait the result of successfull login or not"); 
     loginWaitEvents[1].WaitOne(); 
     Console.WriteLine("Results for login registionSuccess: [ " + registerSuccess + " ]"); 

     if (this.registerSuccess) 
     { 
       // Report current progress 
       //this.bgwProcessLogin.ReportProgress(7, "Register Succesfull"); 
       // Reset flag 
       //this.registerSuccess = false; 
     } 
     else 
     { 
       if (this.lblRegistering.InvokeRequired) 
       { 
        //this.lblRegistering.Invoke(new UpdateRegisterLabelDelegate(this.UpdateRegisterLabel), "Failed to register"); 
       } 
       else 
       { 
        // this.lblRegistering.Text = "Failed to register"; 
       } 
       // Failed attemp 
       e.Cancel = true;    
       return; 
     } 
} 

// Wait for the callback to set the AutoResetEvent 

// Error sometimes happens when the function leaves scope. 
private void VaxSIPUserAgentOCX_OnSuccessToRegister(object sender, EventArgs e) 
{ 
     Console.WriteLine("OnSuccessToRegister() [ Registered successfully ]"); 
     this.registerSuccess = true; 
     this.loginWaitEvents[1].Set(); 
} 


// If the flag is not set, then just time out after 3 seconds for the first LoginWaitEvent.waitOne(3000, true) 
private void VaxSIPUserAgentOCX_OnIncomingDiagnostic(object sender, AxVAXSIPUSERAGENTOCXLib._DVaxSIPUserAgentOCXEvents_OnIncomingDiagnosticEvent e) 
{ 
     string messageSip = e.msgSIP; 

     //Indicates that a user is already logged on (Accout in use). 
     string sipErrorCode = "600 User Found"; 
     if (messageSip.Contains(sipErrorCode)) 
     { 
      // Set flag for account in use 
      this.accountInUseFlag = true; 
      Console.WriteLine("OnIncomingDiagnostic() WaitEvent.Set() accountInUseFlag: " + this.accountInUseFlag); 
      loginWaitEvents[0].Set(); 
     } 
} 
+0

UpdateRegisterLabelとは何ですか?ラベルコントロールにテキストを設定するだけですか? –

答えて

1

あります。。。ほとんどの場合、UpdateRegisterLabelメソッドのインデックスエラーです。

内部例外からスタックトレースを取得すると、より多くの情報が表示されますそれがどこにあるかと密接に関連している

+0

こんにちは、私は私の問題を解決しました。 RunWorkercompletedには何かがありました。しかし、もう一つ事があります。 registerSuccessとAccountInUseは2つの異なるスレッドからアクセスされているため、グローバルです。それらにロックをかける方が良いでしょうか?多くの感謝 – ant2009

+0

boolをロックする必要はありませんが、各スレッドが常に最新の値を持つように、それらをvolatileとしてマークしたい場合があります。 –

関連する問題