Warum ist die streamreader-süchtig bis zu networkstream null zurückgeben auf ReadLine()?
Im code unten habe ich einen StreamReader Lesen aus einem Netzwerk-stream. Dieser code normalerweise läuft gut für Tage. Ich lief in ein problem, wo plötzlich StreamReader.ReadLine() gestartet wird null zurückgeben.
Laut Microsoft-Dokumentation StreamReader.ReadLine() gibt null zurück, wenn es das Ende erreicht hat von der input-stream. Das ergibt keinen Sinn für mich, wenn der zugrunde liegende stream ist ein NetworkStream. Sollte nicht ReadLine() nur blockieren, bis die Netzwerk-stream-Daten empfängt?
Dies ist das erste mal, ich lief in dieses problem, und ich habe nicht in der Lage, es zu duplizieren. Was könnte dies verursachen?
Kontext: erhält die Anwendung der CDR-Datensätze aus einem Telefon-switch. Der Telefon-switch verbindet, um die Anwendung und sendet nur alte text-Datensätze. Nach dem Wechsel verbindet es bleibt verbunden und halten senden von Datensätzen für die Ewigkeit, es sei denn, etwas kaputt.
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
}
}
Hier ist der code, die beginnt, dem Hörer:
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();
}
}
- Ich habe gerade editiert meinen Beitrag, meinem, während <Bedingung> habe den check für den Kunden.Verbunden, wenn das problem aufgetreten ist
- Möchte nur hinzufügen, dass, obwohl
Connected
wahrscheinlich behält den richtigen Wert; ich bin mir nicht sicher, wie zuverlässig der Wert ist, bevor Sie haben Ihren ersten Anruf (es wird überprüft, bevorReadLine
genannt wird)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
StreamReader
blockieren, bis es empfängt Daten oder wird die Verbindung geschlossen. Es klingt wie eine Ausnahme aufgetreten ist, auf der server Seite die Verbindung geschlossen und der client-Seite empfangen keine Daten.Dass ziemlich viel klingt wie der stream geschlossen hat. Ansonsten ja: es würde blockieren. Meine Vermutung: Netzwerk #fail
Wenn die
NetworkStream
keine Daten verfügbar, wird der Anruf zuReadLine()
null zurück weil er meint er erreichte das Ende des Streams.Versuchen, die Kontrolle
NetworkStream.CanRead
undNetworkStream.DataAvailable
vor dem AufrufReadLine
. Wenn die Verbindung nicht geschlossen hat, manuell block, für eine Zeit, dann versuchen, Ihre Daten erneut zu Lesen.BEARBEITEN
Sie können überprüfen, um zu sehen, ob die Verbindung noch geöffnet ist, indem Sie eine
Send
oder die Verwendung der zugrunde liegendenSocket
:ReadLine
Blöcke, aber es sagt, dass er zurückkehren wird, wenn es auf einIOException
,OutOfMemoryException
oder erreicht er das Ende der Eingabe-stream. Kann nicht mehr viel mehr als das. Eines dieser drei Dinge passiert.Connected
sollte funktionieren, aber ich kann nicht sicher sagen.