System.Timers.Timer, вероятно, работает не так, как вы ожидаете, так как использует сообщения Windows, поэтому для этого требуется насос сообщений, которого у вас нет в ваших потоках. Вместо этого посмотрите в System.Threading.Timer.
Но мой основной ответ противоположен ответу Криса Хогана. Не делайте потоки внутри объектов, но в основном коде приложения или, по крайней мере, в слое.
Итак ... вы создаете все свои ServerInfo, которые на данный момент содержат только метаданные, например, имя компьютера.
Затем вы запускаете отдельный поток с помощью System.Threading.Thread, блокируете ArrayList объекта ServerInfo, получаете копию ArrayList, затем выполняете итерацию по нему и вызываете метод Update () для каждого ServerInfo.
Вы можете инициировать событие после каждого обновления или после того, как все они обновятся.
Не забудьте перенаправить вызов из обработчика событий ServerInfo. Обновлен до основного потока! В противном случае вы задержите следующий цикл обновления. И это требование, если вы хотите изменить свойства пользовательского интерфейса.