读书人

listView刷新后怎么回收内存

发布时间: 2012-09-27 11:11:17 作者: rapoo

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(……

读书人网 >C#

热点推荐