C# WinForms DataGridView OutOfMemoryException после создания множественной формы -> не собирается GC - PullRequest
3 голосов
/ 15 апреля 2020

У меня есть форма с 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 часов ...

Кто-нибудь знает, что происходит?

...