【问题标题】:c# there is memory leak when panel property changedc# 面板属性更改时存在内存泄漏
【发布时间】:2016-11-05 02:41:15
【问题描述】:
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;

namespace OcppDummyClient
{
    public partial class Form1 : Form
    {
        public string[] messages = new string[]
        {
           "Authorize",
           "BootNoficiation"
        };

        public Panel A;
        public Panel B;

        public Form1()
        {
            InitializeComponent();
            InitializeForm();

            A = new Panel()
            {
                Width = this.flowLayoutPanel1.Width,
                Height = this.flowLayoutPanel1.Height,
                BackColor = Color.Black
            };

            A.Controls.Add(new Button()
            {
                Text = "Button"
            });

            B = new Panel()
            {
                Width = this.flowLayoutPanel1.Width,
                Height = this.flowLayoutPanel1.Height,
                BackColor = Color.Blue
            };

            B.Controls.Add(new Button()
            {
                Text = "Button2"
            });

            this.flowLayoutPanel1.Controls.Add(A);
            this.flowLayoutPanel1.Controls.Add(B);
        }

        public void InitializeForm()
        {
            this.comboBox1.Items.AddRange(messages);
        }

        private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            string SelectedValue = this.comboBox1.Text.ToString();

            switch(SelectedValue)
            {
                case "Authorize":
                {
                    A.Visible = true;
                    B.Visible = false;
                    break;
                }

                case "BootNoficiation":
                {
                    A.Visible = false;
                    B.Visible = true;
                    break;
                }

                default:
                {
                    break;
                }
            }
        }
    }
}

这是我的全部代码,我想知道为什么当我使用事件处理程序(comboBox1_SelectedValueChanged)更改组合框时会发生内存泄漏。我认为没有发生内存泄漏,因为我已经创建了面板并且只是更改了面板属性(可见)。

【问题讨论】:

  • 为什么会出现内存泄漏?
  • 我刚刚在windows中打开了任务管理,做了一些改变的combobox事件,增加了我的程序内存!
  • 这可能会提供一些线索stackoverflow.com/questions/2820807/…
  • 您只是在谈论增加的内存使用量,而不是内存泄漏。内存泄漏是当内存没有正确释放时,它应该导致程序使用它永远无法释放的内存。您所描述的只是使用更多内存的东西,这可能有多种原因。您所描述的内容对我来说听起来不是问题 - 如果您认为是问题,则必须更详细地描述,以便我们了解您正在寻求解决方案的确切问题。

标签: c# winforms


【解决方案1】:

内存增加并不表示托管内存中存在内存泄漏。内存只会在垃圾回收时被回收。在此之前,内存使用量将会增加。当一个应该被垃圾回收的对象并没有真正死掉(因为有一些无意的活动引用)时,就会发生内存“泄漏”。

话虽如此,您仍然应该小心使用 WinForms 控件。因为它们实际上包装了本机 Windows 控件,所以它们从 Windows 中声明了一个控件句柄。该句柄在调用控件的Dispose 方法时被释放。这可能(并且在大多数情况下会)在垃圾收集期间发生,但在此之前句柄不会返回到窗口(并且在垃圾收集期间没有 100% 的处置保证)。为避免因过多打开的 Windows 句柄而导致资源泄漏,您应该在不再需要 WinForms 控件时立即处理它们。

释放Control 还将释放其Controls 集合中的所有子控件。由于您将两个面板都添加到该集合中,因此您在那里也可能是安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2016-01-27
    • 2010-11-11
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多