このエラーが発生しています。同じビットマップオブジェクトが別のスレッドによってアクセスされているためです。しかし、私はどこでもロックを使用しています。オブジェクトは現在他の場所で使用されています
public class MySingleInstanceClass
{
private Object locker = new Object();
private Bitmap myImage = new Bitmap(100, 100);
public Bitmap MyImage
{
get
{
lock (locker)
return myImage;
}
private set
{
lock (locker)
myImage = value;
}
}
private void Refresh()
{
lock (locker)
{
var g = Graphics.FromImage(myImage);
// do more processing
}
}
}
クラスMySingleInstanceClass
にはインスタンスが1つだけあります。 MyImage
とRefresh()
への通話は、異なるスレッドから来る可能性があります。私が理解する限り、lock(locker)
のコードは別のスレッドで終了するまで実行されませんが、エラーはまだ発生します。誰でもコード内の欠陥を指摘できますか?
例外は、次のようになります。
A first chance exception of type 'System.InvalidOperationException' occurred in System.Drawing.dll
Error: Object is currently in use elsewhere.
at System.Drawing.Graphics.FromImage(Image image)
at (points to the line containing var g = Graphics.FromImage(myImage);)
ゲッター/セッター内のロックは無意味に見えます.... –
MyImageのゲッター(および私設のセッター)をロックすることで、あなたは何を達成したと思いますか?私は大声で考えているので、私は解決策があると仮定しませんが、ロック動作がこのクラスの消費クラスにあった場合、それはより意味をなさないでしょうか? – bas
@MitchWheatよく、私は、MyImageを呼び出すスレッドがRefresh()を呼び出すスレッドがコードブロックを終了するまで待っています。そうしないと、処理が完了する前にmyImageが返されます。私はそれが必要ではないと思いますか?どうして? –