日期:2014-05-17  浏览次数:20852 次

listView刷新后,如何回收内存?
C# code

        List<string> data = new List<string>();
        private void Window_Loaded(object sender, RoutedEventArgs e)  //程序加载后,给listView添加内容
        {

            for(int i=0;i<60000;i++)
            {
                this.data.Add(new string{i+"aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcv" });
            }
            listView.DataContext = data;
        }

        private void button_click(object sender, EventArgs args)   //一个按钮的click事件的触发操作。
        {
            this.data.Clear();
            this.listView.Items.Refresh();
        }




上面的代码中,程序加载后,由于listView显示了60000个条目,因此内存占用很大,大概100多Mb。

但是当我点击按钮,触发了button_click()函数来清空listView后,内存占用依然没有降低下来。我该如何释放这些内存?

求代码。。

------解决方案--------------------
你这个方法有点过分哦

我说说我对C#内存管理的理解

系统内存 托管内存

当变量没有被引用时,会被GC回收,GC会把内存释放到托管堆

但是GC并不一定会将内存归还给系统
因为跟系统申请和释放内存是相对慢的,GC所托管的内存分配释放很快

这样GC在释放对象时会看一下情况,他觉得自己托管的内存不会对系统造成很大压力,就不会将内存归还给系统,所以你在任务管理器里面看到那个进程占用内存并没有减少

但是这样下次再分配内存的时候,就可以直接在托管堆上分配,不必跟系统申请,会快一些

探讨
终于找到了一个很好的方法:
添加一个函数即可:

C# code

[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);
public void FlushMemory(……