0
如果我有一個異步插座和清理資源
listener.BeginAcceptSocket(cbConnect, listener);
回調和我的回調方法:
private void cbConnect(IAsyncResult ar)
{
TcpListener listener = (TcpListener)ar.AsyncState;
MyObj myObj = new MyObj();
myObj.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
myObj.socket = listener.EndAcceptSocket(ar);
listener.BeginAcceptSocket(cbConnect, listener);//start listening again
myObj.socket.BeginReceive(myObj.buffer, 0, myObj.buffer.Length, 0, cbReceive, myObj);
}
這裏是MyObj中類:
Public class MyObj
{
public Socket socket;
public byte[] buffer = new byte[1080];
}
我的問題是如果連接另一端的客戶端從不發送任何數據,那麼myObj會發生什麼? 我將如何關閉套接字並清理資源?
如果連接沒有被刪除但沒有數據發送,GC會清理myObj? –
不可以。如果您想要設置一些空閒超時,您需要設置一個關閉套接字的計時器。您可能需要建立一個協議,以便您可以向另一端發送空閒超時通知,以便知道連接丟失的原因。關閉套接字後,異步接收將停止,對myObj的引用將會失效,並且GC將在下一個傳遞中收集它(假設沒有其他引用)。 – Charlie
謝謝你的建議。 –