2

保存しようとしているビットマップがあり、「オブジェクトは現在別の場所で使用されています」というエラーが表示され続けます。これで、GDI+ はスレッド化lock{}がうまくいかず、このステートメントを使用することになっているが、機能していないことがわかりました。私のコードは以下のとおりです。何が間違っていますか?

Bitmap bitmap = new Bitmap();

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

4 に答える 4

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

于 2012-05-14T17:02:04.980 に答える
3

他のダミーオブジェクトをロックする必要があります。

var objectForLock = new object()

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

それがあなたの問題であるかどうかはわかりませんが、それがlock.Netで機能する方法です。

于 2012-05-14T17:03:08.623 に答える
2

ビットマップを初期化する前に、同期をロックする必要があります。

于 2012-05-14T17:01:12.540 に答える
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
}
于 2012-05-14T17:06:09.543 に答える