何时处理graphics对象

我有一个方法,通过数据收集循环,基于从数据库中检索的集合中的数据build立位图,最后添加我称为DoorSchedules的集合中构build的位图。

在我的循环中,如果我打电话给我的graphics我收到一个错误。 当我不调用属于Graphics对象的.dispose方法时,不会发生此错误。

什么时候应该在循环时调用graphics对象上的dispose,为每个循环创build一个新的graphics对象?

代码如下,直到我取消注释dc.Dispose。

DoorSchedules schedules = new DoorSchedules(); for (byte i = 0; i < elevation.Bays.Count; i++) { if (elevation.Bays[i].HasDoor.Value) { for (byte ii = 0; ii < elevation.Bays[i].Doors.Count; ii++) { door = elevation.Bays[i].Doors[ii]; width = getInchPx(door.WidthInches); height = getInchPx(door.HeightInches); Bitmap canvas = new Bitmap((int)width + DOOR_SCHEDULE_WIDTH_ADD, (int)height + DOOR_SCHEDULE_HEIGHT_ADD); Graphics dc = Graphics.FromImage(canvas); ..work removed for readability for stackoverflow. schedules.Add(new DoorSchedule(canvas)); //dc.Dispose(); }; }; }; 

你可以尝试使用声明来封闭需要处理的对象,这样资源将在完成时自动释放。

从上面的链接:

通常,在使用IDisposable对象时,应该在using语句中声明并实例化它。 using语句以正确的方式调用对象上的Dispose方法,并且(如前所述使用它时)也会在Dispose被调用时立即超出范围。 在使用块中,对象是只读的,不能被修改或重新分配。

看看这样的事情是否适合你,如果它不提供你收到的错误。

 using (Bitmap canvas = new Bitmap((int)width + DOOR_SCHEDULE_WIDTH_ADD,(int)height + DOOR_SCHEDULE_HEIGHT_ADD)) { using( Graphics dc = Graphics.FromImage(canvas)) { } } 

在看你以前的问题,看起来你放弃了使用的使用,因为你最终放弃你的位图,如果这是相同的代码,你可以尝试创建一个你的位图的克隆 。

所以在你的情况下,它会看起来像这样:

 using (Bitmap canvas = new Bitmap((int)width + DOOR_SCHEDULE_WIDTH_ADD,(int)height + DOOR_SCHEDULE_HEIGHT_ADD)) { using( Graphics dc = Graphics.FromImage(canvas)) { dc.DrawEllipse(Pens.Red, 10, 10, 50, 50); pictureBox1.Image = (Bitmap)canvas.Clone(); //The PictureBox is just an object to accept the newly created bitmap. } }