div*_*nci 3 c# sockets variables garbage-collection asynchronous
我认为这个问题实际上是关于我对垃圾收集和变量引用的理解.但是我会继续推出一些代码供你查看.
//请注意不要将此代码用于异步套接字,只是为了突出我的问题
// 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;
..............
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
要创建的第一个SocketTransport(socketTransport_One)具有对Socket对象的强引用(让我们调用~SocketA~).
异步读取完成后,会创建一个新的SocketTransport对象(socketTransport_Two),并强烈引用~SocketA~.
Q1.当方法OnReadOne退出时,垃圾收集器是否会收集socketTransport_One?尽管它仍然包含对~SocketA~的强引用
谢谢大家!