Je pense que cette question est vraiment sur ma compréhension de Garbage collection et variables références. Mais je vais aller de l'avant et jeter un code pour vous de regarder.Code de socket asynchrone - Aide pour la récupération de mémoire
// S'il vous plaît noter ne pas utiliser ce code pour les sockets async, pour mettre en évidence ma question
// 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;
..............
Ma question est la suivante:
La première SocketTransport à créer (socketTransport_One) a une forte référence à un objet Socket (appel est ~ SocketA ~). Une fois la lecture asynchrone terminée, un nouvel objet SocketTransport est créé (socketTransport_Two) avec une référence forte à ~ SocketA ~.
Q1. SocketTransport_One sera-t-il collecté par le garbage collector lorsque la méthode OnReadOne sera fermée? Même s'il contient encore une forte référence à ~ SocketA ~
Merci à tous!
Salut Adam, merci pour l'aide. Si vous avez raison et que socketTransport_One est récupéré, est-ce que Socket sera Dispose() d? Même si elle est utilisée dans socketTransport_Two? – divinci
Non, car 'socketTransport_Two' aura maintenant une forte référence à la socket. Il ne sera pas collecté parce qu'il est encore référencé. –
@divinci La seule façon dont le Socket sera éliminé lorsque le SocketTransport est garbage collect (ce que Brian a mentionné dans une autre réponse, peut ne pas se produire sans appel à EndInvoke) est si la classe SocketTransport a un finalizer qui appelle explicitement Dispose sur le Socket qu'elle possède. –