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