Я согласен с другими, что вы, возможно, захотите взглянуть на асинхронные методы вместо использования отдельных потоков для каждого соединения или, по крайней мере, BackgroundWorker ... Что касается происходящего, вы пробовали отладку, убедившись, что один поток застрялна вызов AcceptTcpClient?Вы можете попытаться указать большое отставание в вызове Start ().Может ли это быть что-то с областью видимости и, возможно, сборкой мусора вашего потока, потому что вы не поддерживаете ссылку на него?Если вы поместите Thread.Sleep (10000) в конце цикла, сможете ли вы подключиться через 10 секунд?Если вы попытаетесь использовать командную строку telnet для подключения к порту (т. Е. «Telnet localhost 9999»), будет ли пустой экран, показывающий, что он подключен?
Можно попробовать что-то вроде добавления хэш-таблицы для хранения ваших потоков и их удаления.при выходе, который добавляет преимущество в том, что у них есть список и возможность закрывать соединения и убивать их ...
Dictionary<TcpClient, Thread> _threads = new Dictionary<TcpClient, Thread>();
object _lockObject = new object();
void AddThread(TcpClient client, Thread thread)
{
lock (_lockObject)
{
_threads.Add(client, thread);
}
}
void RemoveThread(TcpClient client)
{
lock (_lockObject)
{
_threads.Remove(client);
}
}
void YourMainMethod()
{
this._tcpListener.Start();
while (true)
{
//blocks until a client has connected to the server
TcpClient client = this._tcpListener.AcceptTcpClient();
//create a thread to handle communication
//with connected client
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientCommunication));
AddThread(client, clientThread);
clientThread.Start(client);
}
}
private void HandleClientCommunication(object client)
{
try
{
using (TcpClient tcpClient = (TcpClient) client)
{
//Do my work
}
} catch (Exception)
{
// so program doesn't crash
}
finally
{
RemoveThread((TcpClient)client);
}
}