Моя программа выделяет огромную память до тех пор, пока у меня не кончится компьютер. Прикрепленный скриншот для того же.
Метод 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;
}
}