C # Форма Windows с переходом на SQL-память - PullRequest
0 голосов
/ 09 октября 2018

Я работаю над программой, которая запрашивает локальную базу данных SQL Server.Базовая настройка - это основная форма с кнопками, которые открывают новые формы для каждой задачи.Главное окно использует около 20 МБ или памяти.Другие формы, которые используют меньше, чем это.Ничего страшного.

ИСКЛЮЧЕНИЕ:

Всякий раз, когда я открываю форму, содержащую для запуска сценария / соединений SQL, объем памяти увеличивается на 1-2 ГБ на форму.Что я не могу понять, так это то, что я не открываю соединение БД, пока не нажата кнопка.При инициализации формы соединение не открыто.Когда я нажимаю кнопку, соединение открывается, сценарий выполняется, а затем соединение закрывается, но при этом не происходит заметного изменения в использовании памяти.

Более того, память, которую мы не освобождаем, когда язакрыть или избавиться от формы.Я попытался запустить GC.collect и ничего не сделал.

Итак, мои вопросы: почему большой скачок памяти и почему он не освобождается, когда я закрываю форму.

Я новичок в кодировании, поэтому, может быть, я что-то упускаю из виду, но не могу понять.Я обратился к инструктору в моей школе, и там тоже были в тупике.Если вам нужна дополнительная информация, чтобы ответить на вопрос, пожалуйста, дайте мне знать.

Редактировать: вот код.Я знаю, что мне нужно добавить параметры, я получаю там.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace KingKit
{
    public partial class DatabaseRepairForm : Form
    {
        public DatabaseRepairForm()
        {
            InitializeComponent();
        }

        //DBCC BUTTON
        private void ResetSubmitButton_Click(object sender, EventArgs e)
        {
            try
            {                
                Ux_connectionFailed.Visible = false;

                //CONNECTION AND SCRIPT EXECUTION ATTEMPT


                //ESTABLISH CONNECTION
                string dbname = DBNameInput.Text;
                string connection = "server=localhost\\King;" + "Trusted_Connection=yes;" + "Database=" + dbname + "; connection timeout=10";

                SqlConnection conn = new SqlConnection(connection);
                SqlCommand dbcc = new SqlCommand("dbcc checkdb(" + dbname + ") with tableresults", conn);

                conn.Open();
                //CONNECTION CHECK
                if (conn != null && conn.State == ConnectionState.Open)
                {
                    Ux_connectionCheck.Visible = true;
                    Ux_connectionLabel.Visible = true;
                }
                else
                {
                    Ux_connectionLabel.Visible = true;
                    Ux_connectionFailed.Visible = true;

                }

                //CODE EXECUTION
                SqlDataReader reader = dbcc.ExecuteReader();
                while (reader.Read())
                {
                    Ux_repairDisplay.Items.Add(reader["MessageText"].ToString());
                }
                conn.Close();
                }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        //EXIT BUTTON
        private void Ux_appExit_Click(object sender, EventArgs e)
        {
            Dispose();
        }
    }
}

1 Ответ

0 голосов
/ 09 октября 2018

Есть некоторые вещи, которые вам нужно сделать, чтобы код при нажатии кнопки гарантировал правильную очисткуНо перед тем, как мы туда доберемся, вы говорите, что только создание формы вызывает всплеск памяти?

  1. Вы уверены, что основная форма (которая порождает эту форму) не вызывает ни один из своих методов, вызываяданные, которые нужно начать читать?
  2. Попробуйте установить точку останова на свой InitializeComponent () и начать шагать внутрь него, и следить за тем, вызывает ли какая-либо конкретная линия всплеск.

Теперь перейдем ксам кодКак вы можете видеть в MSDN, SqlConnection , SqlCommand и SqlDataReader - все IDisposable.Вы должны поместить одноразовые материалы в оператор using () , чтобы убедиться, что они утилизируются должным образом, если они выходят за пределы допустимого объема или возникают исключения. Также смотрите эту тему .

При запуске с .NET, вероятно, не очевидно, что является одноразовым, а что нет, но общее правило состоит в том, что все внешние ресурсы (базы данных, файлы,сетевые подключения) и графические объекты (формы, элементы управления, шрифты), скорее всего, одноразовые.Обычно вам не нужно располагать элементы управления в форме, потому что форма (действующая как контейнер) будет распоряжаться ими при утилизации.Любые другие IDisposables, которые вы создаете, вы должны очистить сами.

Что касается Ux_repairDisplay, вы, вероятно, ничего не можете сделать там (за исключением, как упомянуто в одном из комментариев, ограничение шума).Если вам нужен шум, возможно, также добавьте ограничение числа в вашем цикле while, чтобы, если вы получаете миллион сообщений, он не выходил из-под контроля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...