Я написал приложение на сервере TCP на c #.Приложение прослушивает входящие соединения
с использованием метода TcpListener.AcceptTcpClient () в основном потоке слушателя.
При получении соединения TcpListener.AcceptTcpClient () разблокирует и возвращает объект TCPClient.
При получении соединения создается новый поток, который начинает читать данные записи в новое соединение.
Новый поток запускается с помощью следующего кода.
while(true)
{
TcpClient client = serverListener.AcceptTcpClient();
if (client.Connected)
{
Thread t = new Thread(delegate() { readWriteData(client); });
t.IsBackground = true;
t.Start(); /// Problem happens here. The thread gets stuck here and doesn't move further
}
}
Приложение работает нормальноно в некоторых случаях на машинах с Windows 7 приложение внезапно перестает прослушивать tcp-соединения.
При анализе стеков потоков приложения в этом состоянии (проводник стека Microsoft использовался для просмотра стеков всех потоков приложения) было обнаружено, что основной поток слушателя застрял в следующей строке раздела кода.показано выше
t.Start(); /// Problem happens here. The thread gets stuck here and doesn't move further
Я провел много исследований и не мог найти, почему это происходит.Такое поведение наблюдается только в системах Windows 7.
Может кто-нибудь, пожалуйста, помогите мне решить эту проблему.
Как предложил Роб,
Я выкладываю здесь трассировку стека, показанную windbg (sos)
0547eae0 7282e006 mscorwks!Thread::StartThread+0xc3, calling mscorwks!_EH_epilog3
0547eb00 727ac825 mscorwks!__SwitchToThread+0xd, calling mscorwks!__DangerousSwitchToThread
0547eb10 728b9c6f mscorwks!ThreadNative::StartInner+0x1ba, calling mscorwks!__SwitchToThread
0547eb58 727e4b04 mscorwks!SafeHandle::DisposeNative+0x3a, calling mscorwks!LazyMachStateCaptureState
0547ebc8 728b9d80 mscorwks!ThreadNative::Start+0xa6, calling mscorwks!ThreadNative::StartInner
0547ec18 728b9d01 mscorwks!ThreadNative::Start+0x1f, calling mscorwks!LazyMachStateCaptureState
0547ec74 71de6afc (MethodDesc 0x71c13048 +0x8c System.Threading.Thread.Start()), calling mscorwks!ThreadNative::Start
0547ec8c 030e2a46 (MethodDesc 0x30da408 +0x25e WindowsService.Server.startListener()), calling (MethodDesc 0x71c13048 +0 System.Threading.Thread.Start())