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));
        }   

c#中释放内存的方法

您不需要做任何事情。这就是托管代码的神奇之处。

但是你想尝试触发你可以使用的垃圾回收器。

    GC.Collect();
    GC.WaitForPendingFinalizers();

但是先读这个然后这个最后是枯燥乏味的MSDN文本