Reputation: 743
I have a StateObject class which is being used to store the data from client and server.
Here is the code:
public class StateObject : IDisposable
{
public StateObject()
{
}
public String serviceName = ConfigurationManager.AppSettings["ServiceName"].ToString().Trim(); //Holds the service name
public Socket clientSocket; //socket for communication with the client
public int id; //client id (A running sequence to keep track of StateObjects)
public string leaseId; //holds the leaseId that is used to communicate with the server
public bool isLeaseIdValid = false;
public string requestQuery = string.Empty;
public IPEndPoint serverEP;
public Socket serverSocket; //Socket for communication with the server
public static int BUFFER_SIZE = Convert.ToInt32(ConfigurationManager.AppSettings["BufferSize"].ToString().Trim()); //Get the buffer size from the state object
public byte[] clientReadBuffer = new byte[BUFFER_SIZE]; // Receive clientReadBuffer.
public byte[] serverReadBuffer = new byte[BUFFER_SIZE];
public int clientNumBytes;
public byte[] clientSendBuffer = new byte[BUFFER_SIZE];
public int serverNumBytes;
public byte[] serverSendBuffer = new byte[BUFFER_SIZE];
public bool isShutdown = false;
public Socket serverSocketPort80; //Socket for communication with the server
public bool ConnectedToPort80 = false; //initially set to false
public ConnectionObject connectionObject;
#region Dispose implementation
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
connectionObject.Dispose();
}
}
~StateObject()
{
Dispose(false);
}
#endregion
}
How do I properly dispose this class and clearup the memory used by the byte array ? The byte arrays are being used to store sent/received messages in a socket communication.
Upvotes: 5
Views: 30803
Reputation: 120518
You don't (as described in @DrewNoakes answer). If you identify this particular section of code as an object creation/memory allocation hotspot, consider creating a pool of byte arrays from which you can lease an already allocated array. Generally I try to do this with server software so there's some sort of upper bound on memory usage.
Upvotes: 5
Reputation: 311315
You only need to dispose unmanaged memory.
In this case it looks like the only thing you need to dispose is the Socket
and possibly the ConnectionObject
, whatever that is.
In other words, dispose any instances of IDisposable
that this class creates.
The garbage collector will take care of the byte arrays once this object falls out of scope.
Upvotes: 13