Это условие состязания между потоком, который вы запускаете здесь:
System.Threading.Thread t = new System.Threading.Thread(() =>
{
client.Connect(ip,port );
});
t.Start();
и блоком окончаний здесь:
finally
{
client.Close();
}
В этом случае основной поток достиг блока, завершенного ранееВаше соединение было завершено.
Создание и очистка объектов действительно должны выполняться в одном потоке, поэтому попробуйте что-то подобное, если только вам действительно не нужно закрытие.
System.Threading.Thread t = new System.Threading.Thread(() =>
{
using(TcpClient client = new TcpClient())
{
client.Connect(ip, port);
//followup code here
}
});
t.Start();