C# 每周我都会收到System.OutOfMemoryException:内存不足
我有一个与嵌入式控制器(Modbus)通信的程序(C#),接收数据并将其记录到数据库中。此外,它在用户界面中显示数据 每5或8天程序就会崩溃(在每台计算机上) 大多数情况下没有例外,只有Windows默认消息“程序名已停止工作” 每隔一段时间,我就会收到“System.OutOfMemoryException:Out of memory.”异常。 我认为这个程序设计得不好,因为内存使用量一直在增加 一周后它达到800Mb 这就是问题所在吗 我每天都尝试重新设置程序。这并没有解决问题 这是来源:C# 每周我都会收到System.OutOfMemoryException:内存不足,c#,memory-leaks,C#,Memory Leaks,我有一个与嵌入式控制器(Modbus)通信的程序(C#),接收数据并将其记录到数据库中。此外,它在用户界面中显示数据 每5或8天程序就会崩溃(在每台计算机上) 大多数情况下没有例外,只有Windows默认消息“程序名已停止工作” 每隔一段时间,我就会收到“System.OutOfMemoryException:Out of memory.”异常。 我认为这个程序设计得不好,因为内存使用量一直在增加 一周后它达到800Mb 这就是问题所在吗 我每天都尝试重新设置程序。这并没有解决问题 这是来源:
namespace AtRegisterData
{
public class RegisterDataManager
{
modbus mb;
public RegisterDataManager()
{
try
{
mb = new modbus();
}
catch (Exception ex)
{
writeError(ex.Message);
}
}
public static bool systemOnOffStatus = false;
public static short systemOnOffState = 0;
public static short reactorNum = 0;
public int openCom(ReactorConfig reactorData)
{
try
{
if (mb.Open(Convert.ToString(ReactorConfigManager.ModBusConfiguration.com_port), Convert.ToInt32(ReactorConfigManager.ModBusConfiguration.ModBusBaudRate), 8, ReactorConfigManager.ModBusConfiguration.parity, ReactorConfigManager.ModBusConfiguration.stopBit))
{
return 1;
}
else
{
return 0; // No connection
}
}
catch (Exception ex)
{
writeError(ex.Message);
return 0;
}
}
public int CheckConnection(ReactorConfig reactorData)
{
try
{
// Needs to take the function data from public struct
if (mb.Open("com20", 115200, 8, Parity.None, StopBits.One))
{
return 1;
}
// Needs to take the function data from public struct
if (mb.Open("com1", 9600, 8, Parity.None, StopBits.One))
{
return 1;
}
else
{
return 0; // No connection
}
}
catch (Exception ex)
{ writeError(ex.Message);
return 0; }
}
public List<ReactorEvent> getEvents(ReactorConfig reactorData)
{
try
{
ushort registerNum;
List<ReactorEvent> eventsList = new List<ReactorEvent>();
// List that will hold all of the data (all the registers)
List<ushort> registerValues;
// Get's the data from the modbus
for (int i = 0; i < ReactorEventConfigManager.ReactorEvents.Count; i++)
{
registerNum = Convert.ToUInt16(ReactorEventConfigManager.ReactorEvents[i].ModBusRegisterNumber); // Convert the register numb to Unsigned short
registerValues = new List<ushort>(); // Initlize the list
try
{
mb.SendFc3(reactorData.ModBusAddress, registerNum, 1, registerValues);
}
catch
{
throw new NoConnectionException();
i = ReactorEventConfigManager.ReactorEvents.Count;
}
if (registerValues.Count > 0 && registerValues[0] == ReactorEventConfigManager.ReactorEvents[i].onFlag) // If the event is on?{eventsList.Add(ReactorEventConfigManager.ReactorEvents[i]);}
{
eventsList.Add(ReactorEventConfigManager.ReactorEvents[i]);
}
}
return eventsList;
}
catch (Exception ex)
{ writeError(ex.Message);
return null; }
}
/// <summary>
/// Reads data from the controller
/// </summary>
/// <param name="reactorNumber">the reactor's ndbuumber</param>
/// <returns></returns>
public Dictionary<Register, string> ReadData(ReactorConfig reactorData, List<short> unitedRegisters)
{
try
{
//Register tempRegister = new Register();
Dictionary<Register, string> returnData = new Dictionary<Register, string>();
string strRegisterValue;
int registerLocation = 0;
List<ushort> registerValues = new List<ushort>(); // List that will hold all of the data (all the registers)
List<ushort> registerValuesNew = new List<ushort>();
List<bool> coilsValues = new List<bool>();
ushort startRegister, endRegister, midRegister;
startRegister = endRegister = midRegister = 0;
if (getStartAndEndReg(ref startRegister, ref endRegister, LoggerConfigManager.LoggerConfiguration.RegistersToLog) == 1)
{
try
{
if (endRegister >= 125)
{
midRegister = Convert.ToUInt16(endRegister - 124);
mb.SendFc3(reactorData.ModBusAddress, startRegister, 125, registerValues); // Get's the data from the modbus
mb.SendFc3(reactorData.ModBusAddress, 125, midRegister, registerValuesNew); // Get's the data from the modbus
if ((systemOnOffStatus == true) && (reactorNum == reactorData.Number))
{
shutdownLamp(reactorData, systemOnOffState);
systemOnOffStatus = false;
}
for (int t = 0; t <= registerValuesNew.Count - 1; t++)
{
registerValues.Add(registerValuesNew[t]);
}
}
else
{
mb.SendFc3(reactorData.ModBusAddress, startRegister, endRegister, registerValues); // Get's the data from the modbus
if ((systemOnOffStatus == true) && (reactorNum == reactorData.Number))
{
shutdownLamp(reactorData, systemOnOffState);
systemOnOffStatus = false;
}
}
}
catch (Exception ex)
{
systemOnOffStatus = false;
writeError(ex.Message);
throw new NoConnectionException();
}
// This loop will organize all of the data received from the modbus in a dictionary
for (int i = 0; i <= registerValues.Count - 1; i++)
{
registerLocation = findRegisterLocationInList(startRegister + i, LoggerConfigManager.LoggerConfiguration.RegistersToLog); // Finds the register to copy by the register number
if (registerLocation != -1)
{
Register tempRegister = new Register();
copyRegisterData(tempRegister, LoggerConfigManager.LoggerConfiguration.RegistersToLog[registerLocation]); // Copy the register Info
if (isRegisterInlist(tempRegister.RegisterNumber, unitedRegisters)) // Check if I need to unite to register to 1 4 byte variant
{
strRegisterValue = Convert.ToString(get4Byte(registerValues[i], registerValues[i + 1])); // Unite 2 registers to 4 byte
i += 1; // Need to skip the next register
}
else
{
if (tempRegister.DivideBy != null && tempRegister.DivideBy.HasValue)
strRegisterValue = Convert.ToString((double)registerValues[i] / tempRegister.DivideBy);
else
strRegisterValue = Convert.ToString(registerValues[i]);
}
returnData.Add(tempRegister, strRegisterValue);
}// Insert the data into dictionary
}
return returnData;
}
throw new NotImplementedException();
}
catch (Exception ex)
{
writeError(ex.Message);
return null;
}
}
命名空间AtRegisterData
{
公共类注册数据管理器
{
modbus mb;
公共注册数据管理器()
{
尝试
{
mb=新modbus();
}
捕获(例外情况除外)
{
writeError(例如消息);
}
}
公共静态bool systemOnOffStatus=false;
公共静态短系统onOffState=0;
公共静态短反应量=0;
公共int openCom(反应器配置反应器数据)
{
尝试
{
if(mb.Open(Convert.ToString(ReactorConfigManager.ModBusConfiguration.com_port)、Convert.ToInt32(ReactorConfigManager.ModBusConfiguration.modbusaudrate)、8、ReactorConfigManager.ModBusConfiguration.parity、ReactorConfigManager.ModBusConfiguration.stopBit))
{
返回1;
}
其他的
{
返回0;//没有连接
}
}
捕获(例外情况除外)
{
writeError(例如消息);
返回0;
}
}
公共int检查连接(ReactorConfig reactorData)
{
尝试
{
//需要从公共结构获取函数数据
如果(mb.打开(“com20”,115200,8,奇偶校验。无,停止位。1))
{
返回1;
}
//需要从公共结构获取函数数据
如果(mb.Open(“com1”,9600,8,奇偶校验。无,停止位。1))
{
返回1;
}
其他的
{
返回0;//没有连接
}
}
捕获(例外情况除外)
{writeError(例如Message);
返回0;}
}
公共列表getEvents(ReactorConfig reactorData)
{
尝试
{
乌斯波特登记;
列表事件列表=新列表();
//保存所有数据的列表(所有寄存器)
列出注册表值;
//从modbus获取数据
对于(int i=0;i0&®isterValues[0]==ReactorEventConfigManager.ReactorEvents[i].onFlag)//如果事件处于打开状态?{eventsList.Add(ReactorEventConfigManager.ReactorEvents[i]);}
{
添加(ReactorEventConfigManager.ReactorEvents[i]);
}
}
返回事件列表;
}
捕获(例外情况除外)
{writeError(例如Message);
返回null;}
}
///
///从控制器读取数据
///
///反应堆的温度是多少
///
公共字典读取数据(ReactorConfig reactorData,列出UnitedRegister)
{
尝试
{
//寄存器tempRegister=新寄存器();
Dictionary returnData=新字典();
字符串stregistervalue;
int registerLocation=0;
List registerValues=new List();//将保存所有数据的列表(所有寄存器)
List registerValuesNew=新列表();
List coilsValues=新列表();
ushort起始寄存器、结束寄存器、中间寄存器;
startRegister=endRegister=midRegister=0;
if(getStartAndEndReg(参考startRegister、参考endRegister、LoggerConfigManager.LoggerConfiguration.RegistersToLog)==1)
{
尝试
{
如果(结束寄存器>=125)
{
中间寄存器=Convert.ToUInt16(端寄存器-124);
mb.SendFc3(reactorData.ModBusAddress,startRegister,125,registerValues);//从modbus获取数据
mb.SendFc3(reactorData.modbus地址,125,中间寄存器,寄存器值new);//从modbus获取数据
if((systemOnOffStatus==true)和&(reactorNum==reactorData.Number))
{
关闭灯(反应器数据、系统关闭状态);
systemOnOffStatus=false;
}
对于(int t=0;t使用内存分析器(如)运行程序5-8天。这将为您提供实际消耗内存的日志。其他一切都只是猜测。使用内存分析器(如)运行程序5-8天。这将为您提供实际消耗内存的日志。其他一切都只是猜测工作。在没有看到任何源代码的情况下,我高度怀疑您没有很好地收集垃圾
int selectedRow = 0;
try
{
if (EventsDataGrid.Rows.Count > 0)
selectedRow = EventsDataGrid.SelectedRows[0].Index;
viewModel = new EventsViewModel();
EventsViewModelSource.DataSource = viewModel;
if (EventsDataGrid.Rows.Count > 0)
{
EventsDataGrid.Rows[selectedRow].Selected = true;
NoteValueLabel.Text = viewModel.Events[selectedRow].Note;
}
}
catch{}
}
viewModel = new EventsViewModel();