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();
                        };
                    };
                };
4

1 回答 1

2

您可以尝试将需要处理的对象包含在using 语句中,这样资源将在完成后自动释放。

从上面的链接:

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

看看这样的东西是否适合您,如果不适合,请提供您收到的错误。

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

    }
}

在查看您之前的问题时,您似乎放弃了使用 using,因为您最终处理了您的位图,如果这是相同的代码,您可以尝试创建您的位图的克隆

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

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.
    }
}
于 2013-02-06T04:37:14.347 回答