在下面的代码中,我有一个StreamReader从网络流中读取。这段代码通常会运行良好几天。但是我遇到了一个问题,就是突然间StreamReader.ReadLine()开始返回null。
根据Microsoft文档,当StreamReader.ReadLine()达到输入流的末尾时,它将返回null。当底层流是NetworkStream时,这对我来说毫无意义。难道ReadLine()不应该一直阻塞,直到网络流接收到数据吗?
这是我第一次遇到这个问题,我还没有能够复制它。是什么导致了这个问题呢?
背景:应用程序从电话交换机接收CDR记录。电话交换机连接到应用程序并发送普通文本记录。在交换机连接后,除非出现故障,否则它将保持连接并继续发送记录。
根据Microsoft文档,当StreamReader.ReadLine()达到输入流的末尾时,它将返回null。当底层流是NetworkStream时,这对我来说毫无意义。难道ReadLine()不应该一直阻塞,直到网络流接收到数据吗?
这是我第一次遇到这个问题,我还没有能够复制它。是什么导致了这个问题呢?
背景:应用程序从电话交换机接收CDR记录。电话交换机连接到应用程序并发送普通文本记录。在交换机连接后,除非出现故障,否则它将保持连接并继续发送记录。
private void ProcessClient(TcpClient client)
{
try
{
using (NetworkStream stream = client.GetStream())
{
using (StreamReader reader = new StreamReader(stream))
{
//continue processing while service is on
while (m_RunService & client.Connected)
{
string curLine = reader.ReadLine();
//code here does stuff to string
//will catch any exceptions that have to do with
//processing the string
}
}
}
}
catch (Exception ex)
{
//write to log
}
}
以下是启动监听器的代码:
private void Listen()
{
try
{
while (m_RunService)
{
try
{
m_TcpClient = m_TcpListener.AcceptTcpClient();
//run on same thread, should only ever be 1 cnx at a time
ProcessClient(m_TcpClient);
}
catch (Exception ex)
{
//write to log
}
finally
{
m_TcpClient.Close();
}
}
}
finally
{
m_TcpListener.Stop();
}
}
Connected
可能会保持正确的值;但在你进行第一次调用之前,我不确定这个值有多可靠(因为它是在调用ReadLine
之前被检查的)。 - bradenb