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))
    {

    }
}

以前の質問を見ると、Bitmap を破棄してしまったために using の使用を放棄したように見えます。これが同じコードである場合は、代わりに Bitmapの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.
    }
}
于 2013-02-06T04:37:14.347 に答える