Ho implementato un sistema che simula l'evento DataReceived di una porta seriale, per cui la lettura dei dati dal NetworkStream di un oggetto TCPClient viene attivata utilizzando il metodo BeginRead() come segue:Chiusura di un NetworkStream dopo aver chiamato BeginRead() in C#
TcpClient server = new TcpClient();
server.Connect(IPAddress.Parse(ip), 10001);
server.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DataReceived), server.GetStream());
che chiama il metodo seguente da un altro thread:
private void DataReceived(IAsyncResult result)
{
res = result;
server.GetStream().EndRead(result);
//append received data to the string buffer
stringBuffer += System.Text.ASCIIEncoding.ASCII.GetString(buffer);
//clear the byte array
Array.Clear(buffer, 0, buffer.Length);
//trigger the parser
waitHandle.Set();
server.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DataReceived), buffer);
}
Ciò sembra funzionare correttamente. Posso inviare e ricevere dati su un dispositivo sulla rete senza problemi. Tuttavia, quando si tenta di disconnettere utilizzando il seguente metodo, il programma si blocca:
public override void disconnect()
{
server.Close();
}
Esso genera il seguente errore:
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
Ho anche provato l'attuazione del metodo disconnessione come segue:
server.GetStream().Close();
, ma il risultato è il seguente errore:
A first chance exception of type 'System.InvalidOperationException' occurred in System.dll
Presumo che questo abbia qualcosa a che fare con il fatto che è stato chiamato il metodo BeginRead() e il metodo EndRead() no. In questo caso, come posso chiudere lo stream senza che si blocchi?
È necessario utilizzare un blocco try attorno alla chiamata EndRead() in modo da poter rilevare ObjectDisposedException. È un indicatore affidabile che la presa si è chiusa in modo imprevisto. –
Ho trovato il problema. Stavo ricevendo un '' System.ObjectDisposedException'' perché le chiamate al metodo EndRead() e BeginRead() non erano circondate da blocchi try/catch. Quando ho chiuso lo stream, questi metodi stavano tentando di eseguire su un oggetto che non esisteva più. – isometrik
Controlla queste risposte, la loro è la stessa domanda: http://stackoverflow.com/questions/43096943/how-to-stop-reading-from-networkstream/43101953#comment73305491_43101953 –