Возможно, это не лучший способ сделать это, но он должен работать ...
Вы можете запустить свой код прослушивателя TCP в новом потоке при запуске программы ... Таким образом, вы прослушиваете код TCP, пока пользовательский интерфейс отключен для выполнения других задач. Когда что-то происходит в потоке TCP, он должен сигнализировать потоку пользовательского интерфейса каким-либо событием или очередью событий.
Теперь, что касается обновления объекта WinForms при получении чего-либо, я полагаю, что только поток, создавший элемент управления WinForms, может обновлять элементы управления. Таким образом, вы должны принять это во внимание также.
Это проблема, с которой я и раньше сталкивался ... В моем текущем проекте я делаю то, что упомянул выше ... однако для его работы довольно много синхронизации потоков.