2014-03-25 77 views
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會發生什麼? 我將如何關閉套接字並清理資源?

回答

1

如果遠程連接斷開,套接字應該通過垃圾收集器自行清理。

+0

如果連接沒有被刪除但沒有數據發送,GC會清理myObj? –

+0

不可以。如果您想要設置一些空閒超時,您需要設置一個關閉套接字的計時器。您可能需要建立一個協議,以便您可以向另一端發送空閒超時通知,以便知道連接丟失的原因。關閉套接字後,異步接收將停止,對myObj的引用將會失效,並且GC將在下一個傳遞中收集它(假設沒有其他引用)。 – Charlie

+0

謝謝你的建議。 –