2012-05-14 34 views
2

我有一個位圖,我試圖保存,並且不斷收到「對象當前正在其他地方使用」錯誤。現在我知道GDI +吸收線程,並且我應該使用lock{}聲明,但它不起作用。我的代碼在下面,我做錯了什麼?使用鎖定語句

Bitmap bitmap = new Bitmap(); 

lock (bitmap) 
{ 
    bitmap.Save([filepath], ImageFormat.Png); 
} 

回答

3

您應該鎖定其他虛擬對象:

var objectForLock = new object() 

lock (objectForLock) 
{ 
    Bitmap bitmap = new Bitmap(); 
    bitmap.Save([filepath], ImageFormat.Png); 
} 

不知道這是你的問題,但是這是方式的.Net lock作品。

+0

爲什麼不應該在'Bitmap'上工作'lock'? – svick

+1

@svick它的一個壞習慣,因爲如果別的東西試圖鎖定你的實例呢? –

+0

@ DanielA.White。和'BitMap'一樣,'':)' – gdoron

2

您應該在初始化位圖之前鎖定同步。

3

您不應該鎖定您要鎖定的對象。您應該創建一個新的引用並鎖定它。

object bitmapLock = new object(); 
Bitmap bitmap = new Bitmap(); 

lock (bitmapLock) 
{ 
    bitmap.Save([filepath], ImageFormat.Png); 
} 

位圖可能鎖定在您無法控制的不同位置。

閱讀關於lock聲明在這裏。

編輯您可能需要修改它創建的線程上的位圖。

http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.80).aspx

+0

有用,但我認爲它是不相關的... –

1

您需要鎖定所有操作,而不僅僅是保存。鎖定只保存不會阻止其他線程操作位圖。

請注意,最好鎖定單獨的對象,因爲每個人都建議。

// class member (or even static) 
private object bitmapLock = new object(); 

// function 1 
lock (bitmapLock) 
{ 
    bitmap.Save([filepath], ImageFormat.Png); 
} 

// function 2 
lock (bitmapLock) 
{ 
    // Draw bitmap 
} 
+0

我想這可能是我被絆倒的地方。如果同一個位圖被多個類訪問會怎麼樣?我怎樣才能讓它鎖定在同一個對象上? – Stylzs05

+0

通過欺騙的方式來讓對象鎖定在某個地方成爲'public static',這可能是一個很好的開始,當所有對位圖的訪問都被相同的鎖保護時,代碼是否真正起作用。請注意,@丹尼爾A.懷特可能是正確的需要編組訪問到原始線程的位圖,這將意味着鎖定不會幫助你......稍後,你可以重構你的代碼,以便鎖定對象訪問需要的地方(也許通過包裝所有操作)。 –