2013-02-06 53 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. 
    } 
} 
相關問題