我有一個位圖,我試圖保存,並且不斷收到「對象當前正在其他地方使用」錯誤。現在我知道GDI +吸收線程,並且我應該使用lock{}
聲明,但它不起作用。我的代碼在下面,我做錯了什麼?使用鎖定語句
Bitmap bitmap = new Bitmap();
lock (bitmap)
{
bitmap.Save([filepath], ImageFormat.Png);
}
我有一個位圖,我試圖保存,並且不斷收到「對象當前正在其他地方使用」錯誤。現在我知道GDI +吸收線程,並且我應該使用lock{}
聲明,但它不起作用。我的代碼在下面,我做錯了什麼?使用鎖定語句
Bitmap bitmap = new Bitmap();
lock (bitmap)
{
bitmap.Save([filepath], ImageFormat.Png);
}
您應該鎖定其他虛擬對象:
var objectForLock = new object()
lock (objectForLock)
{
Bitmap bitmap = new Bitmap();
bitmap.Save([filepath], ImageFormat.Png);
}
不知道這是你的問題,但是這是方式的.Net lock
作品。
您應該在初始化位圖之前鎖定同步。
您不應該鎖定您要鎖定的對象。您應該創建一個新的引用並鎖定它。
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
有用,但我認爲它是不相關的... –
您需要鎖定所有操作,而不僅僅是保存。鎖定只保存不會阻止其他線程操作位圖。
請注意,最好鎖定單獨的對象,因爲每個人都建議。
// 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
}
我想這可能是我被絆倒的地方。如果同一個位圖被多個類訪問會怎麼樣?我怎樣才能讓它鎖定在同一個對象上? – Stylzs05
通過欺騙的方式來讓對象鎖定在某個地方成爲'public static',這可能是一個很好的開始,當所有對位圖的訪問都被相同的鎖保護時,代碼是否真正起作用。請注意,@丹尼爾A.懷特可能是正確的需要編組訪問到原始線程的位圖,這將意味着鎖定不會幫助你......稍後,你可以重構你的代碼,以便鎖定對象訪問需要的地方(也許通過包裝所有操作)。 –
爲什麼不應該在'Bitmap'上工作'lock'? – svick
@svick它的一個壞習慣,因爲如果別的東西試圖鎖定你的實例呢? –
@ DanielA.White。和'BitMap'一樣,'':)' – gdoron