加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

winforms – 拖放如何影响Windows窗体应用程序中的内存使用?

发布时间:2020-12-14 05:26:06 所属栏目:Windows 来源:网络整理
导读:我在使用Visual Studio 2010开发的 Windows窗体应用程序时遇到了一个奇怪的内存错误.我使用的是C#和.NET 4.0,但我不认为这是一个因素.要重现,请启动新的Windows窗体应用程序并添加一个按钮.然后粘贴以下代码: public Form1(){ InitializeComponent(); Allow
我在使用Visual Studio 2010开发的 Windows窗体应用程序时遇到了一个奇怪的内存错误.我使用的是C#和.NET 4.0,但我不认为这是一个因素.要重现,请启动新的Windows窗体应用程序并添加一个按钮.然后粘贴以下代码:

public Form1()
{
    InitializeComponent();
    AllowDrop = true;
    DragEnter += new DragEventHandler(Form1_DragEnter);
    button1.Click += new EventHandler(button1_Click);
}

private void Form1_DragEnter(object sender,DragEventArgs e)
{
    e.Effect = DragDropEffects.Link;
}

private void button1_Click(object sender,EventArgs e)
{
    for(int i = 1; i <= 100000; i++)
    {
        DataGridView dgv = new DataGridView();  // or any other large object
        if(i % 100 == 0)
            Console.WriteLine("{0}: {1} MB memory in use",i,Environment.WorkingSet / 1024 / 1024);
    }
}

运行程序,单击按钮,然后在输出窗口中查看内存使用情况.随着垃圾收集在多个周期中发生,它会飙升然后再下降.然后再次运行它,将任何随机文件或文件夹拖到窗体上,直到您获得链接图标,然后再次单击该按钮.这次内存使用量应该单调增加,就像没有调用垃圾收集一样,或者仍然存在对生成的所有对象的有效引用.

如何将光标设置为链接拖放效果会影响内存使用情况,如此???

解决方法

这是一个已知的WinForms泄漏.
当AllowDrop属性设置为True时发生.
如果将其设置为False,CLR将清除内存.
避免它的最佳方法是不要将表单用作目标drop容器.

您可以使用类似于容器的小面板来切换AllowDrop属性.

这也有效:
在drop,重置AllowDrop,并强制垃圾回收.

void Form2_DragDrop(object sender,DragEventArgs e)
    {
        AllowDrop = false;
        GC.Collect();
        GC.Collect();
        AllowDrop = true;
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读