C# Dynamicly创建的SerialPort停止响应,没有错误

C# Dynamicly创建的SerialPort停止响应,没有错误,c#,multithreading,winforms,serial-port,dynamic-controls,C#,Multithreading,Winforms,Serial Port,Dynamic Controls,我有多个串行设备连接到我的电脑,我正在开发一个程序,允许用户选择任意数量的端口,然后程序将动态创建TabPage并将它们添加到TabControl 每个选项卡页还将有一个多行文本框,显示从分配给它的serialport传入的数据 以下是我尝试动态创建这些控件的代码: private void AddSerialPort(string portName) { var page = new TabPage(portName); page.Text = portName;

我有多个串行设备连接到我的电脑,我正在开发一个程序,允许用户选择任意数量的端口,然后程序将动态创建TabPage并将它们添加到TabControl

每个选项卡页还将有一个多行文本框,显示从分配给它的serialport传入的数据

以下是我尝试动态创建这些控件的代码:

private void AddSerialPort(string portName)
{
    var page = new TabPage(portName);

    page.Text = portName;

    var tb = new TextBox();
    tb.Name = portName;
    tb.Dock = DockStyle.Fill;
    tb.BackColor = Color.Black;
    tb.ForeColor = Color.White;
    tb.Multiline = true;
    page.Controls.Add(tb);
    tabControlActiveSerialPorts.TabPages.Add(page);    

    //Define serial port
    var sp = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One);                

    sp.DataReceived += delegate
    {
        if (tb.InvokeRequired)
        {
            tb.Invoke(new Action(() =>
            {
                var incoming = sp.ReadExisting();
                tb.Text += incoming;                
            }));
        }
        else
        {
            var incoming = sp.ReadExisting();
            tb.Text += incoming;
        }
    };

    sp.Open();
}
问题是,如果我只添加一个
SerialPort
,它就可以正常工作,文本框就会被填满。但是,只要我添加另一个
串行端口
,几秒钟后,第一个或第二个添加的串行端口将停止工作,而另一个仍然工作(这完全是随机的,第一个或第二个串行端口停止在文本框中填充数据,不,这不是我的硬件!)我指的是文本框,指定的内容将不再填充

我没有从调试器收到任何错误…这根本不起作用!知道有什么问题吗

我必须提到,如果我只添加1个串行端口,它的工作正常


我尝试了
BeginInvoke
而不是
Invoke
,但它没有改变任何东西。

可能是
SerialPort
对象被处理掉了。尝试将每个新对象添加到列表中:

class Class
{
    List<SerialPort> ports = new List<SerialPort>();

    private void AddSerialPort(string portName)
    {
       ...
       var sp = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One);
       ports.Add(sp);
       ...
    }       
}
类
{
列表端口=新列表();
私有void AddSerialPort(字符串portName)
{
...
var sp=新的串行端口(端口名,115200,奇偶校验。无,8,停止位。1);
添加端口(sp);
...
}       
}

这似乎解决了问题!!!其实我也想这么做:D无论如何,谢谢!