我使用一个线程打开套接字到服务器并以同步的方式从中读取数据,从而实现了一个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不会像我期望的那样抛出吗? – 2010-03-03 11:31:35
@Abruzzo Forte e外邦人:对不起,不知道。但是不建议使用Thread.Abort。 – dtb 2010-03-03 11:57:40
是的,我知道,但在这种情况下,因为我没有使用异步套接字,所以它是我唯一能做的事情。 顺便说一句,我偶然发现,如果我先打电话.Abort()然后_socket.Close()ThradAbortExcepion可以赶上。 感谢您的大力帮助! Ciao – 2010-03-03 12:03:38