Implementé un sistema que imita el evento DataReceived de un puerto serie, mediante el cual la lectura de datos de un NetworkStream de un objeto TCPClient se desencadena utilizando el método BeginRead() de la siguiente manera:Cerrar un NetworkStream después de llamar a BeginRead() en C#
TcpClient server = new TcpClient();
server.Connect(IPAddress.Parse(ip), 10001);
server.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DataReceived), server.GetStream());
que llama al siguiente método desde otro hilo:
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);
}
Esto parece funcionar correctamente. Puedo enviar y recibir datos a un dispositivo en la red sin problemas. Sin embargo, cuando intento de desconectar mediante el siguiente método, el programa se bloquea:
public override void disconnect()
{
server.Close();
}
Se lanza el siguiente error:
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
También he intentado implementar el método de desconexión de la siguiente manera:
server.GetStream().Close();
pero esto da como resultado el siguiente error:
A first chance exception of type 'System.InvalidOperationException' occurred in System.dll
Supongo que esto tiene algo que ver con el hecho de que se ha llamado al método BeginRead() y no al método EndRead(). Si ese es el caso, ¿cómo puedo cerrar la transmisión sin que se cuelgue?
Debe usar un bloque try alrededor de la llamada EndRead() para que pueda atrapar la ObjectDisposedException. Es un indicador confiable de que el socket se cerró inesperadamente. –
He encontrado el problema. Estaba obteniendo una '' System.ObjectDisposedException'' porque las llamadas al método EndRead() y BeginRead() no estaban rodeadas por bloques try/catch. Cuando cerré la transmisión, estos métodos intentaban ejecutarse en un objeto que ya no existía. – isometrik
Verifique estas respuestas, se trata de la misma pregunta: http://stackoverflow.com/questions/43096943/how-to-stop-reading-from-networkstream/43101953#comment73305491_43101953 –