在C#中从ComboBox添加/删除COM端口

时间:2011-07-11 01:56:53

标签: c# .net com

我正在尝试编写一个程序,该程序利用ComboBox显示从以下方法获得的当前连接的COM端口:

System.IO.Ports.SerialPort.GetPortNames()

这个想法是初始化一个每秒检查当前可用COM端口的线程,并相应地更新ComboBox。尽管我付出了最大的努力,但我无法让它发挥作用。

更新ComboBox内容的代码如下:

    private void Form1_Load(object sender, EventArgs e)
    {
        availPorts = new BindingList<String>();

        Thread t = new Thread(new ThreadStart(update));
        t.Start();
    }

    private void update()
    {
        this.comboBox1.DataSource = availPorts;

        while (true)
        {
            Console.WriteLine("CHECK");

            foreach (String port in System.IO.Ports.SerialPort.GetPortNames())
            {
                if (!availPorts.Contains(port))
                {
                    Console.WriteLine("FOUND");
                    availPorts.Add(port);
                }
            }

            Thread.Sleep(1000);
        }
    }

我可以在找到端口时看到控制台消息,但ComboBox仍为空。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试修改这样的代码。

BindingList<String> availPorts = new BindingList<String>();
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
private void Form1_Load(object sender, EventArgs e)
{

    Thread t = new Thread(new ThreadStart(update));
    t.Start();
    autoResetEvent.WaitOne();
    this.comboBox1.DataSource = availPorts;
}

private void update()
{
    //this.comboBox1.DataSource = availPorts;

    while (true)
    {
        Console.WriteLine("CHECK");

        foreach (String port in System.IO.Ports.SerialPort.GetPortNames())
        {
            if (!availPorts.Contains(port))
            {
                Console.WriteLine("FOUND");
                availPorts.Add(port);
            }
        }

        autoResetEvent.Set();
    }
}

答案 1 :(得分:0)

ComboBox未更新,因为为运行update方法而创建的线程正在尝试更新属于另一个线程的可视控件。在大多数情况下,这会引发错误,但是这不会。

我通过首先创建一个与update分开的方法解决了这个问题,该方法只处理向数据源添加COM端口名称。在此方法中,if语句检查是否需要调用:

private void addPort(String port)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new addPortDelegate(addPort), port);
        }
        else
        {
            availablePorts.Add(port);
            Console.WriteLine("FOUND");
        }
    }

如果需要调用,则通过委托在正确的线程中调用该方法:

private delegate void addPortDelegate(String s);

这会导致更新ComboBox,因为连续执行更新方法会检测到新的COM端口。可以编写类似的方法来删除已从系统断开的COM端口。只是不要忘记在表单关闭时结束线程,否则它将无限旋转。