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

booooook 2011-05-07 04:51:11

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后,内存占用依然没有降低下来。我该如何释放这些内存?

求代码。。
...全文
291 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsppa 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

其实你的data已经是释放了

但你在add产生的对象没用释放,还占着

C# code

public static void main(String[] args)
{
List<string> data=new List<string>();
String one = new String("Good");
String ……
[/Quote]

如果list赋给listview代码上没有问题
this.listView.Items.Refresh();
这个函数很奏效
Icedmilk 2011-05-07
  • 打赏
  • 举报
回复
你这个方法有点过分哦

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

系统内存 托管内存

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

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

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

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

[Quote=引用 12 楼 booooook 的回复:]
终于找到了一个很好的方法:
添加一个函数即可:

C# code

[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);
public void FlushMemory(……
[/Quote]
booooook 2011-05-07
  • 打赏
  • 举报
回复
终于找到了一个很好的方法:
添加一个函数即可:

[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);
public void FlushMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}


其中DllImport的命名空间是 using System.Runtime.InteropServices;

当你想要释放内存空间的时候,就调用函数FlushMemory()即可。
booooook 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 icedmilk 的回复:]
俺用的是WinForm

帮你试试

引用 8 楼 booooook 的回复:
引用 7 楼 icedmilk 的回复:
怪了,为什么我的ListView里面没有DataContext属性


你的是Visual studio里的WPF程序吗?
[/Quote]

WinForm和WPF有不少区别的。我用的是WPF.
Icedmilk 2011-05-07
  • 打赏
  • 举报
回复
俺用的是WinForm

帮你试试
[Quote=引用 8 楼 booooook 的回复:]
引用 7 楼 icedmilk 的回复:
怪了,为什么我的ListView里面没有DataContext属性


你的是Visual studio里的WPF程序吗?
[/Quote]
booooook 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 icedmilk 的回复:]
怪了,为什么我的ListView里面没有DataContext属性
[/Quote]

你的是Visual studio里的WPF程序吗?
Icedmilk 2011-05-07
  • 打赏
  • 举报
回复
怪了,为什么我的ListView里面没有DataContext属性
booooook 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 csharemyside 的回复:]
C# code

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

for(int i=0;i<60000;i++)
……
[/Quote]

还是不行。。
CShareMySide 2011-05-07
  • 打赏
  • 举报
回复

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(i。ToString()+"aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcv" );
}
listView.DataContext = data;
}

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




这样改下看看
CShareMySide 2011-05-07
  • 打赏
  • 举报
回复
其实你的data已经是释放了

但你在add产生的对象没用释放,还占着


public static void main(String[] args)
{
List<string> data=new List<string>();
String one = new String("Good");
String two = new String("Nice");
data.add(one);
data.add(two);

data.clear();
System.out.println("one = " + one);
}


booooook 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fengyarongaa 的回复:]
内存GC的释放是在VS里面自动的

当然

你一可以强制性的释放
[/Quote]

我点击了按钮后,一个小时过去了,内存还没有被释放。

我就是希望强制性的释放,可是看了一些教程,还是不懂释放。。。

如果有懂得,能否贴些代码,让参考参考?
ycproc 2011-05-07
  • 打赏
  • 举报
回复
内存GC的释放是在VS里面自动的

当然

你一可以强制性的释放

110,476

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧