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

时间:2014-05-30 23:28:06

标签: c# .net multithreading streamreader irc

我通过TCP连接IRC服务器。到目前为止,我通过独立的任务读取数据,非常好。但是,如果我想退出程序,我就不能退出该线程,因为它卡在reader.ReadLine()命令中(threadShouldRun没有影响)。使用中断()或中止()似乎也不会改变任何东西。

要么我需要一种方法来确定何时有更多行要读取,或者我需要强行杀死该线程(即使这很糟糕)。

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));
        }
    }
}

2 个答案:

答案 0 :(得分:1)

解决方案是在接收套接字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发生,引发异常,您将处理它,并且在检查时线程将终止。

答案 1 :(得分:1)

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

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