C# 使用AutoResetEvent的调用异常

C# 使用AutoResetEvent的调用异常,c#,multithreading,autoresetevent,C#,Multithreading,Autoresetevent,2005年 我正在使用后台工作人员处理一些登录信息。但是,后台工作人员必须停止并等待2个事件发生。这些工作完成后,后台工作人员即可完成其工作。它们是将调用AutoResetEvent的Set()方法的回调 因此,我使用AutoResteEvent设置这两个事件何时完成。但是,我似乎收到了以下错误消息: “调用的目标已引发异常。” 内部异常 索引超出范围。必须为非负数且小于集合的大小。参数名称:索引” 异常通常在注册成功离开范围时触发 非常感谢你的建议 后台工作程序的代码 // Waiting f

2005年

我正在使用后台工作人员处理一些登录信息。但是,后台工作人员必须停止并等待2个事件发生。这些工作完成后,后台工作人员即可完成其工作。它们是将调用AutoResetEvent的Set()方法的回调

因此,我使用AutoResteEvent设置这两个事件何时完成。但是,我似乎收到了以下错误消息: “调用的目标已引发异常。”

内部异常 索引超出范围。必须为非负数且小于集合的大小。参数名称:索引”

异常通常在注册成功离开范围时触发

非常感谢你的建议

后台工作程序的代码

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

UpdateRegisterLabel方法中很可能存在索引错误


从内部异常获取堆栈跟踪,它会更精确地指向它所在的位置。

UpdateRegisterLabel做什么?它只是在label控件上设置文本吗?您好,我解决了我的问题。这是RunWorkercompleted中的某个内容。但是,还有一件事。registerSuccess和AccountInUse是全局的,因为它们是全局的已从两个不同的线程访问。对它们进行锁定是否更好?非常感谢您不需要锁定bool,但您可能希望将它们标记为volatile,以确保每个线程始终具有最新的值。