c#中释放内存的方法
本文关键字:方法 内存 释放 | 更新日期: 2023-09-27 18:03:34
我从serialport读取数据[],然后在richtexbox中以十六进制字符串显示。
private string ByteArray_to_Hex(byte[] data) {
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data) {
buffer_log.Add(b); // save data in buffer to write to file
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
}
GC.Collect();
return sb.ToString().ToUpper();
}
private void Log(string msg) {
try {
Richtexbox.Invoke(new EventHandler(delegate {
Richtexbox.AppendText(msg);
if (Richtexbox.Text.Length > 1000000) {
// seem to slow when comparing to amount of data reading
Richtexbox.Select(10000, 950000);
Richtexbox.SelectedText = "";
}
}));
} catch {
}
}
private void PLay_Click()
{
Log(ByteArray_to_Hex(data_come_from_serialport);
}
由于有很多文本,它消耗了很多内存。但是当我调用
private void menu_Clear_Click(object sender, EventArgs e) {
Richtexbox.Clear();
buffer_log.Clear();
GC.Collect();
}
它不释放内存,仍然消耗大量内存。释放这些记忆的最好方法是什么?
<标题>更新:因为这是最好的方法。这是什么问题?我描述了我的问题:这个应用程序在运行1小时时总是有systemoutofmemory异常。如果我运行这个应用程序55分钟,然后调用Clear方法,它只工作5分钟,并有systemoutofmemory异常。有人能解释一下吗?
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (!SerialPort.IsOpen)
{
return;
}
if (flag_stop)
{
return;
}
int bytes = SerialPort.BytesToRead;
byte[] buffer = new byte[bytes];
SerialPort.Read(buffer, 0, bytes);
Log(ByteArray_to_Hex(buffer));
}
标题>
您不需要做任何事情。这就是托管代码的神奇之处。
但是你想尝试触发你可以使用的垃圾回收器。
GC.Collect();
GC.WaitForPendingFinalizers();
但是先读这个然后这个最后是枯燥乏味的MSDN文本