下面函数运行2分钟后发生内存不足错误,使用了using 和disposed()都无效,请高手帮忙!!!!
private void timer1_Tick(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Image gt = Image.FromFile("d:\\1.bmp");
Point cc = new Point(100, 100);
Point dd = new Point(300, 300);
g.DrawImage(gt, 265, 211, 290, 210);
gt.Dispose();
g.Dispose();
}
private void timer1_Tick(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Image gt = Image.FromFile("d:\\1.bmp");
Point cc = new Point(100, 100);
Point dd = new Point(300, 300);
g.DrawImage(gt, 265, 211, 290, 210);
gt.Dispose();
g.Dispose();
}
太快了……建议你改一下。你建立一个缓存,把你要读的图片尽可能读好,读到一个地方,比如说数组或者列表里……然后你TICK的时候,从那里去读图……而不是以你现在的方式……还有 Dispose 并没有立即释放内存……只是提交一种请求罢了……GC的效率嘛……我只是觉得,从你提供的代码看,再也看不出别的问题了。
private void button7_Click(object sender, EventArgs e)
{
//得到图片文件列表
DirectoryInfo ddg = new DirectoryInfo("d:\\pic");
FileInfo[] filelist = ddg.GetFiles();
foreach (FileInfo file in filelist)
{
filer.Add("d:\\pic\\"+file.Name);
}
timer1.Interval = 2000;
timer1.Start();
} private void timer1_Tick(object sender, EventArgs e)
{
int len = filer.Count;
Graphics g = this.CreateGraphics();
Image gt = Image.FromFile(filer[sss]);
Point cc = new Point(100, 100);
Point dd = new Point(300, 300);
g.DrawImage(gt, 265, 211, 290, 210);
gt.Dispose();
g.Dispose();
sss++;
if (sss == len)
sss = 0;
}想实现图片浏览效果,可是一会就内存不足了
试过using()
{}
和
Graphics g = this.CreateGraphics();
Image gt = Image.FromFile(filer[sss]);
try{
}
finally
{
if(g!=null)
((IDisposable).g).Dispose();
if(gt!=null)
((IDisposable).gt).Dispose();
}
都无效!!!!
这行放到类里面,不要每次定时都执行,也不要gt.Dispose。
测试代码:
public partial class Form2 : Form
{
ArrayList filer = new ArrayList();
int sss = 0;
public Form2()
{
InitializeComponent();
}
private void button7_Click(object sender, EventArgs e)
{
//得到图片文件列表
DirectoryInfo ddg = new DirectoryInfo("F:\\图片\\其它");
FileInfo[] filelist = ddg.GetFiles();
foreach (FileInfo file in filelist)
{
filer.Add("F:\\图片\\其它\\" + file.Name);
}
timer1.Interval = 10;
timer1.Start();
} private void timer1_Tick(object sender, EventArgs e)
{ int len = filer.Count;
Graphics g = this.CreateGraphics();
Image gt = Image.FromFile(filer[sss].ToString());
g.DrawImage(gt, 0, 0, this.Size.Width, this.Size.Height);
sss++;
if (sss == len)sss = 0;
}
}
Image gt = Image.FromFile(filer[sss]);
把你的 Image gt = Image.FromFile("d:\\1.bmp"); 放Time_Tick外边..没事拼命打开文件做什么呢.
FileStream stream = File.Open(strFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Image OriginalImage = Image.FromStream(stream, true); // Very Important to set true if we close the stream after
stream.Close(); Image imgClone = (Image)(OriginalImage.Clone());
Graphics g = Graphics.FromImage(OriginalImage); g.DrawString("test", DefaultFont, new SolidBrush(Color.Black), 0, 0);
this.BackgroundImage = OriginalImage;
filer.Clear();foreach (FileInfo file in filelist)
{
filer.Add("F:\\图片\\其它\\" + file.Name);
}
好主意啊, 一条线程在后台地预读文件,填到一个 List 中; 一条线程显示 List 中的文件, 做点线程保护即可
using (Image tmpImag = new Bitmap(gt.Width, gt.Height))
{
using (Graphics tmpG = Graphics.FromImage(tmpImag))
{
tmpG.DrawImage(gt, 0, 0, gt.Width, gt.Height);
}
using (Graphics g = this.CreateGraphics())
{
g.DrawImage(gt, 0, 0, this.Size.Width, this.Size.Height);
}
}
gt.Dispose();
{
timer1.Stop();
Graphics g = this.CreateGraphics();
Image gt = Image.FromFile("d:\\1.bmp");
Point cc = new Point(100, 100);
Point dd = new Point(300, 300);
g.DrawImage(gt, 265, 211, 290, 210);
gt.Dispose();
g.Dispose();
timer1.Start();
}
楼主加上这两句试试
Point cc = new Point(100, 100);
Point dd = new Point(300, 300);
是不是要释放啊