我觉得这个问题真的是我对的理解垃圾回收和变量引用。但我会继续,并抛出一些代码供您查看。一些异步套接字代码 - 帮助垃圾收集?
//请注意不要使用异步套接字这段代码,只是为了突出我的问题
// 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_One被垃圾收集 - 它的Socket是Dispose()d吗?即使它在socketTransport_Two中使用? – divinci 2010-04-19 16:41:35
不,因为'socketTransport_Two'现在将对套接字有强烈的引用。它不会被垃圾收集,因为它仍然被引用。 – 2010-04-19 19:44:15
@divinci当SocketTransport被垃圾回收时(如Brian在另一个回答中提到的,没有对EndInvoke的调用可能不会发生),Socket将被丢弃的唯一方式是如果SocketTransport类具有明确调用Dispose的终结器它拥有的插座。 – 2010-04-21 16:05:52