我正在尝试编写一个程序,该程序利用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仍为空。任何帮助将不胜感激。
答案 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端口。只是不要忘记在表单关闭时结束线程,否则它将无限旋转。