【发布时间】:2014-07-04 18:58:24
【问题描述】:
我从串口中读取字节[]中的数据,然后在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));
}
更新从串口读取数据的方式。
【问题讨论】:
-
什么都不做。在几乎所有情况下,这都是最好的方法。你的情况也不例外。几乎可以肯定,您会误解任何信息告诉您它正在使用“大量”内存。
-
我在任务管理器中看到这个应用程序在运行前后使用的内存(一个小时然后调用 Clear 方法)。
-
任务管理器是衡量内存使用率的不好方法。除其他外,它显示的是虚拟内存,而不是物理内存。
-
您对自己工作的环境缺乏基本的了解:它是托管的。你不管理内存..环境可以。
-
因为这是最好的方法。这是什么问题。我描述了我遇到的问题:
标签: c# .net c#-4.0 memory memory-management