【问题标题】:ThreadAbort not working with readline from a socketThreadAbort 不适用于来自套接字的 readline
【发布时间】:2011-01-23 03:42:11
【问题描述】:

我实现了一个 TCP 客户端,它使用一个线程打开一个到服务器的套接字并以同步的方式从中读取数据。 当 String thisLine = aReadStream.ReadLine(); 行阻塞时,因为没有数据可以从套接字读取,我尝试执行 Thread.Abort 来杀死线程(因为它在 ReadLine() 上被阻塞)我希望能够捕捉到 @ 987654323@ 但是我不能。

线程在ReadLine() 上仍然被阻塞,并且没有被杀死。 在我在线程中使用的代码下方。

你知道为什么我做错了什么,以及如何解除对 ReadLine() 的阻塞吗?

私有无效 readSocket_andTriggerEvents() { TcpClient aClient = null; 尝试 { aClient = new TcpClient(); aClient.Connect(_HOST, _PORT); Trace.WriteLine("套接字连接"); NetworkStream aStream = aClient.GetStream(); StreamReader aReadStream = new StreamReader(aStream); int nTimes = 0; 而(this.isSocketThreadStarted) { 字符串 thisLine = aReadStream.ReadLine(); // 当没有数据时 // 可用应用程序挂在这里。 // Thread.Abort 不起作用! } } 捕获(ThreadAbortException ex) { Trace.WriteLine("线程被暴力杀死"); // 我从来没有来过这里!! } 捕捉(SocketException ex) { Helper.ShowErrorMessage(ex); } 最后{ aClient.Close(); Trace.WriteLine("套接字关闭"); } }

【问题讨论】:

  • 关闭套接字以获取来自另一个线程的输入。这将导致读取遇到流结束,因此应该关闭套接字并退出线程,

标签: c# sockets


【解决方案1】:

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

【讨论】:

  • 感谢您的帮助!如果你还在的话,还有一件事:你知道为什么没有像我预期的那样抛出 ThreadAbortException 吗?
  • @Abruzzo Forte e Gentile:抱歉,不知道。但无论如何都不推荐使用 Thread.Abort。
  • 是的,我知道,但是在这种情况下,因为我没有使用异步套接字,所以这是我唯一能做的。顺便说一句,如果我先调用 .Abort() 然后调用 _socket.Close() ,我偶然发现 ThradAbortExcepion 可以被捕获。感谢您的大力帮助!乔
  • 抛出 IOException。内部异常是 SocketException。
【解决方案2】:

不要将StreamReader 用于网络流。它只是不适用于无限流。

至于为什么Thread.Abort 不起作用,这很简单——Thread.Abort 仅在线程处于WaitSleepJoin 状态或类似状态时才起作用。如果线程正在运行,它必须在托管代码中 - 阻塞套接字调用很可能在非托管代码中运行(/blocking),因此Abort 在它返回之前无法工作。没有办法“杀死”一个线程——可以(或多或少)安全地杀死的最小的东西就是一个进程。

当然,这就是为什么 Thread.Abort 在之后关闭套接字时会神奇地开始工作的原因 - 这会解除线程阻塞并使其返回到托管代码,Thread.Abort 可以在其中发挥其骇人听闻的魔力。

【讨论】:

    猜你喜欢
    • 2013-06-26
    • 2014-04-02
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多