2009-05-16 2 views
0

C# 2005Исключение вызова с использованием AutoResetEvent

Я использую фона рабочего для обработки некоторых данных для входа. Тем не менее, фоновый работник должен остановиться и ждать, пока произойдут 2 события. Как только они закончатся, работник фона может выполнить свою работу. Это обратные вызовы, которые будут вызывать метод Set() для AutoResetEvent.

Поэтому я использую AutoResetEvent, чтобы установить, когда эти 2 события завершены. Однако, похоже, я получаю это сообщение об ошибке: «Исключение выбрано целью вызова».

И внутреннее исключение Указатель был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра:. Индекс»

Исключение обычно срабатывает, когда успех регистрации покидает сферу

Большое спасибо за любые советы

Код для фона рабочего

// 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 являются глобальными, поскольку к ним обращаются из двух разных потоков. Было бы лучше поставить на них замок? Большое спасибо – ant2009

+0

Вам не нужно блокировать bools, но вы можете пометить их как volatile, чтобы каждый поток всегда имел самое последнее значение. –

Смежные вопросы