我實現了一個模仿串口的DataReceived事件的系統,從TCPClient對象的NetworkStream讀取數據是通過使用BeginRead()方法觸發的,如下所示:在C#中調用BeginRead()後關閉NetworkStream
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);
}
這似乎正常工作。我可以毫無問題地向網絡上的設備發送和接收數據。然而,當我嘗試使用下面的方法,程序崩潰斷開:
public override void disconnect()
{
server.Close();
}
它引發以下錯誤:
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
我也試圖實現斷開方法如下:
server.GetStream().Close();
但這會導致以下錯誤:
A first chance exception of type 'System.InvalidOperationException' occurred in System.dll
我認爲這與BeginRead()方法已被調用並且EndRead()方法沒有的事實有關。如果是這種情況,我怎樣才能關閉流而不會崩潰?
您需要圍繞EndRead()調用使用try塊,以便捕獲ObjectDisposedException。這是一個可靠的指標,套接字意外關閉。 –
我發現了這個問題。因爲EndRead()和BeginRead()方法調用沒有被try/catch塊包圍,所以我得到一個''System.ObjectDisposedException''。當我關閉流時,這些方法試圖在不再存在的對象上執行。 – isometrik
檢查這些答案,他們是關於相同的問題:http://stackoverflow.com/questions/43096943/how-to-stop-reading-from-networkstream/43101953#comment73305491_43101953 –