다음과 같이 BeginRead() 메서드를 사용하여 TCPClient 객체의 NetworkStream에서 데이터를 읽는 방식으로 직렬 포트의 DataReceived 이벤트를 모방 한 시스템을 구현했습니다. 다른 스레드에서 다음 메소드를 호출C#에서 BeginRead()를 호출 한 후 네트워크 스트림 닫기
TcpClient server = new TcpClient();
server.Connect(IPAddress.Parse(ip), 10001);
server.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DataReceived), server.GetStream());
는 :
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);
}
이 제대로 작동하려면 나타납니다. 네트워크상의 장치로 데이터를 보내고받을 수 있습니다. 그러나, 나는 다음과 같은 방법, 프로그램 충돌 사용하여 분리 할 때 : 나는 또한 다음과 같이 분리 방법을 구현하는 시도
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
:
public override void disconnect()
{
server.Close();
}
그것은 다음과 같은 오류가 발생을
server.GetStream().Close();
이 결과로 다음 오류가 발생합니다.
A first chance exception of type 'System.InvalidOperationException' occurred in System.dll
이 작업은 BeginRead() 메서드가 호출되었고 EndRead() 메서드가 수행되지 않았다고 가정합니다. 그렇다면 어떻게 충돌없이 스트림을 닫을 수 있습니까?
EndRead() 호출에서 try 블록을 사용해야 ObjectDisposedException을 catch 할 수 있습니다. 소켓이 예기치 않게 닫힌다는 안정적인 표시입니다. –
문제를 발견했습니다. EndRead() 및 BeginRead() 메서드 호출이 try/catch 블록에 의해 둘러싸이지 않았기 때문에''System.ObjectDisposedException ''이 발생했습니다. 스트림을 닫을 때이 메소드는 더 이상 존재하지 않는 객체에서 실행하려고 시도하고있었습니다. – isometrik
다음 질문에 대한 답변을 확인하십시오. http://stackoverflow.com/questions/43096943/how-to-stop-reading-from-networkstream/43101953#comment73305491_43101953 –