Close串口后再重新Open串口,报出“对端口的访问被拒绝”,这显然是之前关串口没有关掉,重复打开了,为什么会这样?解决思路

Close串口后再重新Open串口,报出“对端口的访问被拒绝”,这显然是之前关串口没有关掉,重复打开了,为什么会这样?
在软件中,在串口的Data_Received事件中若发生了异常,将相应操作杆线程关闭,关掉串口,再重新打开串口,再重新打开。在打开串口的时候会报异常“对端口的访问被拒绝”。这显然是之前关串口没有关掉,重复打开了,为什么会这样?

  private void CloseJoystickerRightport()
        {
            try
            {
                while (JoystickerLexium23dPort.IsOpen)
                {
                    joyStickRightPortKeepReading = false;
                    JoystickerLexium23dPort.DataReceived -= new SerialDataReceivedEventHandler(JoystickerRightport_DataReceived);
                    JoystickerLexium23dPort.DiscardOutBuffer();
                    JoystickerLexium23dPort.DiscardInBuffer();
                    JoystickerLexium23dPort.Close();  
                }
            }
            catch (System.Exception ex)
            {
                writeExceptionToLogFile("CloseXYZJoystickRightport", ex.Message);
            }
        }
private void OpenJoystickRightPot()
{
            try
            {
                //if (JoystickerLexium23dPort.IsOpen)
                //{
                while (JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Close();
                if (!JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Open();
                //}
                //else
                //{
                //    JoystickerLexium23dPort.Open();
                //}
                JoystickerLexium23dPort.DiscardOutBuffer();
                JoystickerLexium23dPort.DiscardInBuffer();
                JoystickerLexium23dPort.WriteTimeout = 100;
                JoystickerLexium23dPort.ReadTimeout = 100;  //**操作杆一发送命令,即使没有动操作杆,也会返回值  //MJ
                JoystickerLexium23dPort.DataReceived += new SerialDataReceivedEventHandler(JoystickerRightport_DataReceived);
}
}
catch(Exception ex)
{
   writeExceptionToLogFile("OpenXYZJoystickRightport", ex.Message);
}

------解决方案--------------------
private void OpenJoystickRightPot()
{
            try
            {
                //if (JoystickerLexium23dPort.IsOpen)
                //{
                while (JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Close();
                if (!JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Open();
                //}
                //else
                //{
                //    JoystickerLexium23dPort.Open();