串口有关问题和鼠标乱飘的有关问题

求助串口问题和鼠标乱飘的问题
首先是串口问题,我使用网上的listening和Closing方法,解决了不会卡死的问题,但是出现了新的问题,就是在关闭串口的时候需要关闭两次才能关闭成功。关闭一次我按暂停发现程序一直停在DoEvent()中。
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (serialPort1.IsOpen == false)
                {
                    serialPort1.PortName = comnu.Text;   //端口名
                    serialPort1.BaudRate = int.Parse("9600");//设置波特率
                    button1.Text = "关闭";
                    Closing0 = false;
                    try
                    {
                        serialPort1.Open();  //打开串口
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }

                }
                else
                {
                    Closing0 = true; 
                    while (listening0) Application.DoEvents();
                    value.Clear();
                    try
                    {
                        serialPort1.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    Closing0 = false; 
                    button1.Text = "打开串口";
                    

                }
            }
            catch 
            {
                MessageBox.Show("请先打开串口");
            }
        }
这是关闭按钮。每次关闭串口都要按两下按钮才能关闭完然后按钮上的Text变成打开串口。
这个求大神解答一下。。。

2.还有一个问题是我现在机器上连接了2个485转USB通信的端口,它们会一直有数据从下位机里发送出来,然后我PC经常会一开机鼠标就不听使唤,一直乱飘,需要拔掉2个485转USB接头再插好,鼠标才不会飘。。这个该怎么解决。。求各位帮帮忙。

新人一枚,分给的不多,见谅。。
------解决方案--------------------
想要关闭串口的时候不要与串口线程冲突,最好的办法就是打开关闭的操作都放到线程函数里去.

按钮只负责开一个线程或告诉线程可以关闭了.

线程在启动的时候打开串口,并循环处理数据.
要关闭的时候,退出循环,关闭串口.
------解决方案--------------------
1,添加一个静态变量static int nThreads,用于保存delegate启动次数.在进入delegate块后nThreads++,delete块结束前nThreads--