ComboBox не обновляется, поскольку поток, созданный для запуска метода обновления, пытается обновить визуальный элемент управления, принадлежащий другому потоку. В большинстве случаев это приведет к ошибке, однако здесь это не так.
Я решил эту проблему, сначала создав метод, отдельный от 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-портов, которые были отключены от системы. Только не забудьте завершить нить, когда форма закроется, иначе она будет вращаться бесконечно.