Я знаю, что этот вопрос задавался ранее, но ни один из существующих ответов не решил мою проблему. У меня есть приложение WinForms, которое связывается с несколькими устройствами, получает данные и записывает их в файл.
Открывает связь GPIB и последовательного порта и в конце закрывает их все. Я использую this.Dispose()
и this.Close()
, чтобы убедиться, что память освобождена (по крайней мере, я думаю, что память освобождена). Однако при следующем запуске через несколько часов я получаю сообщение об ошибке:
Попытка чтения или записи в защищенную память. Это часто
признак того, что другая память повреждена.
При повторном запуске время сбоя становится все короче, как будто что-то накапливается в памяти. Я копирую части своего кода, которые, похоже, связаны с этой проблемой. Я делаю какие-либо ошибки в потреблении памяти?
Что я пробовал:
Добавлены функции this.Dispose()
и Close()
для закрытия портов (изначально я забыл добавить их). Но все равно не помогло. Я также пытался перезагрузить компьютер перед каждым запуском, но это тоже не помогло.
public partial class Form1 : Form
{
//GPIB and serial ports
SerialPort Arduino;
SerialPort serialPort1 = new SerialPort();
private Device DMM1, DMM2, DMM3;
private Address DMM1_Address, DMM2_Address, DMM3_Address;
private Address[] Address_List = new Address[3];
private AddressCollection GPIB_Adds;
Board GPIB = new Board(0);
//Timers
System.Windows.Forms.Timer fire_time = new System.Windows.Forms.Timer();
System.Windows.Forms.Timer measurement_time = new System.Windows.Forms.Timer();
System.Windows.Forms.Timer preparation_delay = new System.Windows.Forms.Timer();
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
public Form1()
{
// ...some code
}
private void InitializePorts()
{
// ...ports are initialized here
}
private void button1_Click(object sender, EventArgs e)
{
preparation_delay.Interval = 1000;
preparation_delay.Tick += new EventHandler(start);
preparation_delay.Start();
measurement_time.Interval = 60000;
measurement_time.Tick += new EventHandler(stop);
fire_time.Interval = Convert.ToInt32(textBox6.Text) * 1000;
fire_time.Tick += new EventHandler(FIRE);
}
}
private void start(object obj, EventArgs e)
{
stopwatch.Start();
measurement_time.Start();
fire_time.Start();
preparation_delay.Stop();
preparation_delay.Tick -= new EventHandler(start);
//Here I try to annihilate the event handler in fear of staying in memory
}
private void FIRE(object obj, EventArgs e)
{
string p = //Reads data from device
string[] k = //Reads data from device
string t = //Reads data from device
Write_to_Text(t, p, k);
}
private void stop(object obj, EventArgs e)
{
fire_time.Stop();
measurement_time.Stop();
progress.Stop();
}
private void Write_to_Text(string time_date, string PRC_Reading, string[] DMM_Reading)
{
string string_to_save = ...some string
try
{
System.IO.File.AppendAllText(@filename, string_to_save);
}
catch (Exception ex)
{
serialPort1.Close();
Arduino.Close();
GPIB.Dispose();
measurement_time.Stop();
fire_time.Stop();
this.Dispose();
this.Close();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
serialPort1.Close();
Arduino.Close();
GPIB.Dispose();
this.Dispose();
this.Close();
}
}