У меня есть форма с DataGridView в нем. Я открываю и закрываю (создаю и удаляю) форму несколько раз, и это вызывает проблемы с памятью. G C не собирает его, и через пару часов работы возникает исключение OutOfMemoryException.
Данная форма имеет несколько компонентов. Я попытался воспроизвести мою проблему без каких-либо компонентов, и я сузил свою проблему до одного. Эта проблема c один имеет 3 DataGridViews в нем. Когда я удаляю эти DGV, моя проблема просто исчезает.
Я пытался проверить любой случай, когда DGV не вызвали бы «утечку памяти» (я не уверен, что могу так это назвать), и я не мог не могу найти.
Я даже пытался
for (int index = 0; index < 2000000000; index++)
{
var dataGridView = new DataGridView();
dataGridView.Dispose();
Console.WriteLine(index.ToString());
}
Это продолжается и продолжается до тех пор, пока не появится OOM Exception. Конечно, когда я набираю
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
, все выглядит нормально, память освобождается, но это не элегантно, не правильно и в основном просто >> НЕ << </strong>
Пример кода:
for (int index = 0; index < 2000000000; index++)
{
var form1 = new Form1();
form1.Dispose();
Console.WriteLine(index.ToString());
}
(это автоматически сгенерированный код в файле Form.Designer.cs)
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.dataGridView1 = new System.Windows.Forms.DataGridView();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.SuspendLayout();
//
// dataGridView1
//
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Location = new System.Drawing.Point(205, 116);
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.Size = new System.Drawing.Size(240, 150);
this.dataGridView1.TabIndex = 0;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.dataGridView1);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.ResumeLayout(false);
}
и код разработчика, который на данный момент просто пуст
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
И да, мой пример с пустым DGV без каких-либо событий, и мое исключение продолжает появляться. Конечно, мой пример - преувеличение, и я бы не открывал свою форму 2000000000 раз. Мне просто потребовалось oop, чтобы воспроизвести мою проблему без каких-либо данных.
В реальном мире OOM Исключение происходит после 5-6 часов непрерывной работы, и мы все знаем, что большинство людей работают на 8 часов ...
Кто-нибудь знает, что происходит?