2013-02-06 135 views
1

我有一个方法可以遍历数据集合,根据从数据库中检索的集合中的数据构建位图,最后将构建的位图添加到我称为DoorSchedules的集合中。什么时候处理图形对象

在我的循环中,如果我在图形上调用.dispose,我会收到一个错误消息。当我不调用属于Graphics对象的.dispose方法时,不会发生此错误。

当我循环时应该在图形对象上调用dispose时,是否为每个循环创建一个新的图形对象?

下面的代码工作,直到我取消注释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(); 
         }; 
        }; 
       }; 
+2

“我收到一个错误”。谨慎与我们分享? –

+0

什么方法调用会给你一个错误,什么是错误? –

+0

由于某些奇怪的原因,我无法重现错误。当它再次抛出时,我会发布错误。 –

回答

2

您可以尝试封闭你的对象需要在using statements处置,这样完成后的资源将被自动释放。

从上面的链接:

通常,当您使用IDisposable的对象,你应该声明,并在声明中使用实例化它。 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)) 
    { 

    } 
} 

在看着你刚才的问题,它看起来像你放弃了使用,因为你们结束了处置你的位图的,如果这是相同的代码,你可以尝试创建位图的Clone代替。

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

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. 
    } 
} 
相关问题