大家不要被C#的外表迷住了,好看不中用,我说对了吗?
自从C#一产生,我就认为它很优美,到现在除了它漂亮外,我也不知它能作什么?做个图像,加载到Picture占用内存一直占下去,不释放,不象Delphi,C++等来个Free,Delete
可以见到内存马上减小
来看一下呢,可以帮我改一下代码吗?
我的图片文件有30M的样子
Bitmap bit = null;
//两个按钮交替点击N次,内存会占到几百M,吓人呢?
private void toolStripButton1_Click(object sender, EventArgs e)
{
pictureBox1.Image = null;
bit=new Bitmap(@"c:\2\a.bmp");
pictureBox1.Image = bit;
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
pictureBox1.Image = null;
bit=new Bitmap("c:\\1\\b.jpg");
pictureBox1.Image = bit;
}
--------------------编程问答-------------------- 无语, Dispose()。。。 --------------------编程问答-------------------- 自从C#产生。。LZ搞.NET用C#10来年了? --------------------编程问答-------------------- 那你不要问了,换吧。 --------------------编程问答-------------------- LZ真NX --------------------编程问答-------------------- c#那里漂亮了。。。。。。。没发觉啊
自己不会用怪工具 --------------------编程问答-------------------- 每一种语言存在都有它存在的道理。
你用眼睛去看细胞,当然看不见,你难道还要去医院做眼睛手术么?
如果眼睛通过显微镜看细胞,是不是很清楚? --------------------编程问答-------------------- 楼主换C++ --------------------编程问答-------------------- 楼主有实力啊 --------------------编程问答-------------------- 最近CSDN怎么了,老出一些不明所以的贴。 求助问题的贴反倒没人关注了。 --------------------编程问答-------------------- 混饭吃而已...
如果进入另一行业,有赚更多钱的能力,还写程序干嘛? --------------------编程问答--------------------
还是小sun老实. 说实话了. --------------------编程问答--------------------
还真挺漂亮的,这么多语言里就C#最顺眼了。 --------------------编程问答-------------------- 楼主换C++ --------------------编程问答-------------------- delphi最2了,看那语法就蛋疼 --------------------编程问答-------------------- 我知道怎么改,就不告诉你,去C++ delphi 问去 --------------------编程问答-------------------- 漂亮不漂亮关C#什么事呀
同样对于楼主这种C#菜鸟,你不懂得资源释放,关C#什么事呀 --------------------编程问答-------------------- 典型的拉不出易做图来怪地球引力. --------------------编程问答-------------------- 释放???
我一般直接给回收了。。。
这是马甲贴? --------------------编程问答-------------------- 其实大家也不必疯狂对LZ拍砖,LZ考虑到的问题很多初级的程序员可能考虑不到,C#的释放方式与其他程序不同,初学者不注意的话很容易忘记释放。
对于LZ的例子,只要增加dispose即可,
private void toolStripButton1_Click(object sender, EventArgs e)
{
Bitmap r= pictureBox1.Image;
pictureBox1.Image = null;
if(r!=null)
{
r.Dispose();
}
bit=new Bitmap(@"c:\2\a.bmp");
pictureBox1.Image = bit;
}
但是某些情况,如申请了数组时,处理会复杂些,好在c#提供了GC.Collect()方法,可以手工的清除垃圾。
因此上面的程序也可加上GC.Collect()方法,该方法还有个比C++的好处就是可以一次处理多个空间申请的回收。
某些复杂的自定义类,需要重写Dispose方法,(如我以前遇到Excel编程时,要释放掉所有Excel对象系统才能真正退出),这样做,C#的优点就体现出来了:即统一的一次性释放所有申请的资源。
所以大家(尤其是新手),看了这个帖子还是要感谢LZ,赶紧看看自己的代码有没有释放干净资源吧。 --------------------编程问答-------------------- 要善用Dispose和using。
--------------------编程问答-------------------- 从学习的角度来说,要感谢楼主。
但是,没必要问问题用这样的方式来问吧.
谦虚的问问题有这么难么? --------------------编程问答--------------------
用dispose()还是一直占用内存的喔 --------------------编程问答-------------------- 我特意试过了,dispose()和GC.Collect()在你的程序中都是可行的。 --------------------编程问答-------------------- DISPOSE不能保证占用的内存被释放,内存一直被占用是因为FrameWork为了提升自身的效率而做的优化。
但是当内存占用上涨到一定程度的时候就会逐渐停止的,楼主试试主动调用垃圾回收器试一试
此外,如果频繁像楼主这样操作,读入图片,需要更改你的代码,像这样
--------------------编程问答-------------------- 注意的一点是,dispose()或GC.Collect时,你的待释放对象不能被使用中,不然释放不掉。这点目的是避免 C里面释放错误造成的很多难以调试的BUG。所以C#的程序出现崩溃的几率比C的小。 --------------------编程问答-------------------- C#可以说是目前基于虚拟机的语言中最优秀的了,它的虚拟机也非常非常强大,楼主你可以好好学一学 --------------------编程问答-------------------- 学习了。 --------------------编程问答--------------------
FileStream fs = new FileStream( "Filepath ",IO.FileMode.Open);
byte[] bytes=new byte[fs.Length];
fs.Read(bytes,0,bytes.Length);
fs.Close();
MemeryStream ms = new MemeryStream(bytes);
Bitmap img = new Bitmap(ms);
pictureBox1.Image=img;
纯路过的 --------------------编程问答-------------------- 我是来打酱油的 --------------------编程问答-------------------- 学习。 --------------------编程问答-------------------- 支持,用c#还是托管算了 --------------------编程问答-------------------- 路过,学习, --------------------编程问答--------------------
你的方法仍然不行 --------------------编程问答--------------------
你是不是把上面的代码放到了click事件里面了啊,我觉得 Tr0j4n的意思应该是把两张图片一次性调入内存,不用每次点击按钮的时候重新调入了 --------------------编程问答-------------------- 有人说。net5.0以前都不稳定,所以不学。 --------------------编程问答--------------------
可能路径改一下,用OpenDialog控件实现吧,我看20张图片不为过吧,一个图片20M也不大吧,,,试一下呢,内存是越看越涨 --------------------编程问答-------------------- 学习了.. 受益匪浅啊 --------------------编程问答-------------------- 愚蠢
任何一种语音都只是一个工具 有自己的最佳适用范围
小刀和螺丝刀都能拧螺丝,你去抱怨小刀拧螺丝没螺丝刀那么轻松那我只能说你脑子进水了。
一个称职的程序员从来不分什么.net程序员还是java程序员C++程序员。
C#这个语言本事就不是为最优化资源占用而设计的,它是为了更建议地构建网站(简单来说就是省事,为了更高的开发效率)。如果你要高性能,那直接用C++甚至是标准C,甚至是你自己可以开发出一门语言来(当年的perl就是这么来的)
不要去抱怨语言不好用。你抱怨C#没有C++好用的时候。不是说明C#不如C++,而是这个时候你更需要C++而不是C#,那么你应该做的不是抱怨C#,而是去使用C++来完成你需要的设计。
(什么?你只会C#?那是你的问题。你不是一个称职的程序员!) --------------------编程问答-------------------- --------------------编程问答--------------------
+1 --------------------编程问答--------------------
+1
lz就是一朵奇葩啊~ --------------------编程问答--------------------
奇葩就奇葩吧,希望楼主继续努力,噶油哈~~~~~ --------------------编程问答-------------------- 应该要用java --------------------编程问答-------------------- 酱油酱油你在哪里 --------------------编程问答-------------------- 我在这里
拉不出易做图赖茅房有木有。 --------------------编程问答-------------------- 楼主你知道不,
跟系统申请内存和释放内存都是由开销的
而C#一旦跟系统申请了内存就不会轻易返还给系统,它自己会管理内存 --------------------编程问答--------------------
别说的那么露骨啊
补充:.NET技术 , 非技术区