试图中断一个卡在reader.readLine()中的线程

本文关键字:线程 reader readLine 一个 中断 | 更新日期: 2023-09-27 18:05:55

我通过TCP与IRC服务器建立了连接。我独立完成了阅读数据的任务,到目前为止,还不错。然而,如果我想退出程序,我不能退出线程,因为它卡在reader.ReadLine()命令中(threadShouldRun没有影响)。使用Interrupt()或Abort()似乎也不会改变任何东西。

我需要一种方法来确定何时有更多的行要读,或者我需要强制终止线程(即使这很糟糕)。

private System.Threading.Thread myThread;
private bool threadShouldRun = true;
private StreamReader reader;
private void readStream()
{
    while(threadShouldRun)
    {
        string line = reader.ReadLine();
        if (line != null)
        {
            newLineEvent(this, new NewLineEventArgs(line));
        }
    }
}

试图中断一个卡在reader.readLine()中的线程

使用如下所示的BeginRead之类的异步调用,并避免循环:

http://msdn.microsoft.com/en-us/library/system.io.stream.beginread.aspx

一种解决方案是在您的接收套接字(http://msdn.microsoft.com/it-it/library/system.net.sockets.socket.receivetimeout(v=vs.110).aspx)上设置TimeOut

一旦时间过期,将引发SocketException,因此您可以捕获它并在threadShouldRun上重申控制。

如果您想退出(因此将threadShouldRun设置为false),有两种情况:

  1. 接收到的数据,您将对其进行处理,在下一次检查时,变量将被发现为false,线程将终止;
  2. 没有收到数据,TimeOut发生,引发异常,你将处理它,并在检查时线程将终止。