我认为这个问题实际上与我对垃圾回收和变量引用的理解有关。但是我会提供一些代码让你看看。
// 请注意,不要将此代码用于异步套接字,只是为了强调我的问题
// SocketTransport
// This is a simple wrapper class that is used as the 'state' object
// when performing Async Socket Reads/Writes
public class SocketTransport
{
public Socket Socket;
public byte[] Buffer;
public SocketTransport(Socket socket, byte[] buffer)
{
this.Socket = socket;
this.Buffer = buffer;
}
}
// Entry point - creates a SocketTransport, then passes it as the state
// object when Asyncly reading from the socket.
public void ReadOne(Socket socket)
{
SocketTransport socketTransport_One =
new SocketTransport(socket, new byte[10]);
socketTransport_One.Socket.BeginRecieve
(
socketTransport_One.Buffer, // Buffer to store data
0, // Buffer offset
10, // Read Length
SocketFlags.None // SocketFlags
new AsyncCallback(OnReadOne), // Callback when BeginRead completes
socketTransport_One // 'state' object to pass to Callback.
);
}
public void OnReadOne(IAsyncResult ar)
{
SocketTransport socketTransport_One = ar.asyncState as SocketTransport;
ProcessReadOneBuffer(socketTransport_One.Buffer); // Do processing
// New Read
// Create another! SocketTransport (what happens to first one?)
SocketTransport socketTransport_Two =
new SocketTransport(socket, new byte[10]);
socketTransport_Two.Socket.BeginRecieve
(
socketTransport_One.Buffer,
0,
10,
SocketFlags.None
new AsyncCallback(OnReadTwo),
socketTransport_Two
);
}
public void OnReadTwo(IAsyncResult ar)
{
SocketTransport socketTransport_Two = ar.asyncState as SocketTransport;
..............
所以我的问题是:
第一个创建的SocketTransport(socketTransport_One)对一个Socket对象有强引用(我们称其为~SocketA~)。
一旦异步读取完成,将创建一个新的SocketTransport对象(socketTransport_Two),该对象也具有对~SocketA~的强引用。
Q1. 当OnReadOne方法退出时,socketTransport_One会被垃圾回收器回收吗?即使它仍然包含对~SocketA~的强引用。
socketTransport_Two
现在将对套接字有一个强引用。它不会被垃圾回收,因为它仍然被引用着。 - Adam Maras