一些异步套接字代码 - 帮助垃圾收集?

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~的强引用

谢谢大家!

Ada*_*ras 5

在你的榜样,socketTransport_One 应该被垃圾收集的,因为没有任何其他物体的强引用.仅仅因为它对另一个对象有强烈的引用并不意味着它没有资格进行垃圾回收.