首页 文章

ThreadAbort无法使用套接字中的readline

提问于
浏览
0

我使用线程打开服务器的套接字并以同步方式从服务器读取数据来实现TCP客户端 . 当行 String thisLine = aReadStream.ReadLine(); 阻塞因为没有数据要从套接字读取而我尝试执行 Thread.Abort 来杀死该线程(因为它在该ReadLine()上被阻塞)我希望能够捕获 ThreadAbortException BUT 我可以'吨 .

线程在 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");
     }

}

2 回答

  • 0

    从另一个线程关闭套接字 . 当ReadLine被阻止时,这应该抛出SocketException .

  • 2

    不要将 StreamReader 与网络流一起使用 . 它只适用于无限流 .

    至于为什么 Thread.Abort 不是很简单 - 只有当线程处于 WaitSleepJoin 状态或类似情况时_902229才有效 . 如果线程正在运行,则它必须在托管代码中 - 阻塞套接字调用最有可能在非托管代码中运行(/阻塞),因此 Abort 在返回之前无法工作 . 没有办法"kill"一个线程 - 可以(或多或少)安全杀死的最小的东西是一个过程 .

    这当然是为什么 Thread.Abort 如果你之后关闭套接字会神奇地开始工作 - 解锁线程并使其返回托管代码,其中 Thread.Abort 可以做其hacky魔术 .

相关问题