Компьютер не хватает памяти, как только программа подключается к серверу TCP - PullRequest
0 голосов
/ 11 октября 2019

Моя программа выделяет огромную память до тех пор, пока у меня не кончится компьютер. Прикрепленный скриншот для того же.

enter image description here

Метод ReadMessages () вызывается из бесконечного цикла для чтения любых данных с сервера. После подключения к tcp-серверу использование моей системной памяти увеличивается и заканчивается через некоторое время.

Из моего понимания я знаю, что выделяю 8192 байта массива (byte [] byDataIn)каждый раз , однако они должны быть нераспределены, когда элемент управления выходит из области видимости.

Я пытался сделать переменную byte [] byDataIn в качестве члена класса, но ошибка метода ReadMessages () вызвала ошибку в буфере.

Я новичок в C #, так что любезно извинитея от глупых вопросов.

 public class TCPClientClass
    {
        NetworkStream Sender;
        NetworkStream Receiver;
        //private StreamReader SrReciever;
        private Thread thrMessaging;
        TcpClient tcp;
        bool connected = false;
        String strCommand = String.Empty;
        //byte[] byDataIn;
        byte[] byDataOut;
        Queue qQueueIn;
        Queue qQueueOut;
        private static Mutex muQueueIn   = new Mutex();
        private static Mutex muQueueOut  = new Mutex();
        String responseData = String.Empty;
        String sendData = String.Empty;
        public TCPClientClass()
        {
            qQueueIn    = new Queue();
            qQueueOut   = new Queue();
        }

        private String StrCommand { get { return strCommand; } set { strCommand = value; } }

        public bool Connected { get { return connected; } set { connected = value; } }
        //public bool Connect(IPAddress IP, int nPortNo)
        public async Task<bool> Connect(IPAddress IP, int nPortNo)
        {
            tcp = new TcpClient();
            //byDataIn = new byte[tcp.ReceiveBufferSize];
            byDataOut = new byte[tcp.SendBufferSize];
            try
            {
                await tcp.ConnectAsync(IP, nPortNo);
                thrMessaging = new Thread(new ThreadStart(ThreadFunction));
                thrMessaging.Start();
                Connected = true;
            }
            catch
            {
                MessageBox.Show("Unable to connect to server");
            }
            return connected;
        }

        public void Disconnect()
        {
            Sender?.Close();
            Receiver?.Close();
            tcp?.Close();
            thrMessaging.Abort();
            Connected = false;
        }
        private void ThreadFunction()
        {
            while (thrMessaging.IsAlive)
                DoTasks();
        }
        private void DoTasks()
        {
            if (Connected)
            {
                var a = ReadMessages();
                var b = SendMessages();
            }
        }

        private /*void*/async Task ReadMessages()
        {
            Receiver = tcp.GetStream();

            if (Receiver.CanRead)
            {
                try
                {
                    byte[] byDataIn = new byte[tcp.ReceiveBufferSize];
                    var response = await Receiver.ReadAsync(byDataIn, 0, byDataIn.Length);

                    //add the data to the queue
                    muQueueIn.WaitOne();
                    responseData = Encoding.ASCII.GetString(byDataIn);                    
                    qQueueIn.Enqueue(responseData);
                    Array.Clear(byDataIn, 0, byDataIn.Length);
                    muQueueIn.ReleaseMutex();

                    Thread.Sleep(1000);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
        }

        private async Task  SendMessages()
        {
            try
            {
                if (!string.IsNullOrEmpty(strCommand))
                {
                    byDataOut = Encoding.ASCII.GetBytes(strCommand);
                    Sender = tcp.GetStream();

                    await Sender.WriteAsync(byDataOut, 0, byDataOut.Length);
                    Sender.Flush();
                    strCommand = String.Empty;
                    Thread.Sleep(1000);
                }                    
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        public void AddCommand(String strCmd)
        {
            StrCommand = strCmd;
        }
    } 

...