3

特定のポートでリッスンし、デバイスがそのポートに到達するのを待機しているサーバーアプリケーションを作成しようとしています。デバイスが接続されると、デバイスは30秒ごとに接続します。デバイスはMACアドレスを送信します。しかし、問題はメモリが増え続け、決して解放されないことです。

class Server
{
    Object threadLock = new Object();
    bool stopListening = false;
    Socket clientSocket = null;

    private  void StartDeviceListener()
    {

        try
        {
            // create the socket
            clientSocket = new Socket(AddressFamily.InterNetwork,
                                             SocketType.Stream,
                                             ProtocolType.Tcp);

            // bind the listening socket to the port
            IPEndPoint ep1 = new IPEndPoint(IPAddress.Any, 60000);
            clientSocket.LingerState = new LingerOption(false, 0);

            clientSocket.Bind(ep1);
            clientSocket.Listen(10); //Waiting for Devices to connect.

            do
            {
                // start listening
                Console.WriteLine("Waiting for device connection on {0}....", 60000);
                Socket deviceSocket = clientSocket.Accept();
                //Console.WriteLine(deviceSocket.
                #region ThreadPool

                // ThreadPool.QueueUserWorkItem(ProcessRequest, (Object)deviceSocket);
                Thread ts = new Thread(ProcessRequest);
                ts.IsBackground = true;
                ts.Start((Object)deviceSocket);
                ts.Join();
                #endregion
            } while (!stopListening);

        }
        catch (Exception ex)
        {
            Console.WriteLine("exception... : " + ex.Message);
            StartDeviceListener();
        }

        finally
        {
            if (clientSocket != null) { clientSocket.Close(); clientSocket = null; }
        }

    }

    public void Stop()
    {
        try
        {
            stopListening = true;
            if (clientSocket != null)
            {
                clientSocket.Disconnect(false);
                clientSocket = null;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("exception : " + ex.Message);
        }
    }


    void ProcessRequest(Object args)
    {
        using (Socket deviceSocket = args as Socket)
        {
            try
            {

                //lock the thread while we are creating the client IO Interface Manager
                lock (threadLock)
                {
                    byte[] readBuffer = new byte[1024];
                    // Read from buffer
                    int count = deviceSocket.Receive(readBuffer, 0, readBuffer.Length, SocketFlags.None);
                    String macAddress = "";//mac address sent by the device:
                    if (count > 0)
                    {
                        Encoding encoder = Encoding.ASCII;
                        int size = 0;
                        while (count > 0)
                        {
                            size += count;
                            // get string
                            macAddress += encoder.GetString(readBuffer, 0, count).Trim();
                            // Read from buffer
                            count = 0;
                        }
                        Console.WriteLine(string.Format("{0} trying to connect....", macAddress));
                    }
                    deviceSocket.Close();
                    readBuffer = null;
                }
                //threadLock = null;

            }
            catch (Exception ex)
            {
                Console.WriteLine("exception : " + ex.Message);
            }
        }
        args = null;
    }

  public  void Start()
    {
        StartDeviceListener();
    }
}`

実行中の初期サーバー

初期メモリ消費量

デバイス接続 初期接続後のメモリ消費

デバイス接続

複数接続後のメモリ消費

4

1 に答える 1

1

しかし問題は、メモリが増え続け、決して解放されないことです。

それはまだメモリリークとはかけ離れています。あなたはおそらく、存在しない問題を追っています。

最後のショットでは、まだ 10MB のワーキング セットがあり、実質的にゼロです。
本当にメモリの問題を見つけて解決したい場合は、プロファイラーを使用してください。

于 2012-09-24T16:36:30.200 に答える