我通过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));
}
}
}
答案 0 :(得分:1)
解决方案是在接收套接字http://msdn.microsoft.com/it-it/library/system.net.sockets.socket.receivetimeout(v=vs.110).aspx上设置TimeOut
。
一旦时间到期,将引发SocketException
,因此您可以捕获它并重新对threadShouldRun进行控制。
如果您想退出(因此将threadShouldRun设置为false),有两种情况:
TimeOut
发生,引发异常,您将处理它,并且在检查时线程将终止。答案 1 :(得分:1)
使用如此处所示的BeginRead之类的异步调用,并避免循环:
http://msdn.microsoft.com/en-us/library/system.io.stream.beginread.aspx