서버에 소켓을 열고 동기식으로 데이터를 읽는 스레드를 사용하여 TCP 클라이언트를 구현했습니다. String thisLine = aReadStream.ReadLine();
블록이 소켓에서 읽을 데이터가 없기 때문에 스레드를 죽이기 위해 Thread.Abort
을 수행하려고합니다 (해당 ReadLine()에서 차단되어 있기 때문에) ThreadAbortException
그러나을 잡을 수 있기를 기대합니다. 나는 할 수 없다.ThreadAbort가 소켓에서 readline과 함께 작동하지 않습니다.
스레드는 ReadLine()
에 차단되어 있으며 죽지 않습니다. 내 스레드에서 사용중인 코드 아래에.
왜 내가 뭘 잘못하고 있으며 ReadLine() 차단을 해제하려면 어떻게해야하는지 알고 있습니까?
private void readSocket_andTriggerEvents() { TcpClient aClient = null; try { aClient = new TcpClient(); aClient.Connect(_HOST, _PORT); Trace.WriteLine("Socket Connected"); NetworkStream aStream = aClient.GetStream(); StreamReader aReadStream = new StreamReader(aStream); int nTimes = 0; while (this.isSocketThreadStarted) { String thisLine = aReadStream.ReadLine(); // when no data // is available the application hangs here. // Thread.Abort doesn't work! } } catch (ThreadAbortException ex) { Trace.WriteLine("The Thread was brute-forced killed"); // I never come here!! } catch (SocketException ex) { Helper.ShowErrorMessage(ex); } finally{ aClient.Close(); Trace.WriteLine("socket closed"); } }
도움 주셔서 감사합니다. 아직도 주위에 있다면 한 가지 더 : 내가 예상대로 ThreadAbortException이 throw되지 않는 이유를 알고 있습니까? –
@Abruzzo Forte e Gentile : 죄송합니다. 그러나 Thread.Abort를 사용하는 것은 어쨌든 권장하지 않습니다. – dtb
예.하지만이 시나리오에서는 비동기 소켓을 사용하지 않기 때문에 제가 할 수있는 유일한 방법입니다. 처음에는 .Abort()를 호출 한 다음 _socket.Close()를 호출하면 우연히 발견했습니다. ThradAbortExcepion을 catch 할 수 있습니다. 큰 도움을 주셔서 감사합니다! Ciao –