2

クライアントとサーバーからのデータを格納するために使用されている StateObject クラスがあります。

コードは次のとおりです。

 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
    }

このクラスを適切に破棄し、バイト配列によって使用されるメモリをクリアするにはどうすればよいですか? バイト配列は、ソケット通信で送受信されたメッセージを格納するために使用されています。

4

2 に答える 2

10

アンマネージ メモリのみを破棄する必要があります。

この場合、破棄する必要があるのはSocketと、おそらく 、ConnectionObjectそれが何であれ.

IDisposableつまり、このクラスが作成するインスタンスを破棄します。

このオブジェクトがスコープ外になると、ガベージ コレクターがバイト配列を処理します。

于 2012-10-23T15:17:15.827 に答える
5

あなたはしません(@DrewNoakesの回答で説明されているように)。コードのこの特定のセクションをオブジェクト作成/メモリ割り当てのホットスポットとして特定する場合は、既に割り当てられている配列をリースできるバイト配列のプールを作成することを検討してください。通常、私はサーバー ソフトウェアでこれを実行しようとしているので、メモリ使用量にはある種の上限があります。

于 2012-10-23T15:18:53.083 に答える