私の MVC 3 C# アプリケーションには、一度に 1 つの要求で使用できるようにしたい静的オブジェクトがあります。それへのアクセスはメソッドを介してのみですが、そのメソッドを呼び出す間、ロックを保持したいと思います。
呼び出しはコントローラーでのみ行われ、通常は 1 つまたは 2 つのロックされたコード ブロックがあります。
最初は、いくつかの静的パブリック オブジェクトを公開し、それを次のように単純に使用したいと考えていました。
lock(MyClass.lockObject)
{
MyClass.doStuff();
MyClass.doStuff2();
}
、しかし、どこかにロックするのを忘れる可能性があるため、エラーが発生しやすいと思います。Monitor.Enter()
コンストラクターとMonitor.Exit()
Dispose メソッドで使用してから、メソッドを非静的に変更するのが適切な方法なのだろうか? 次のように言います。
public class MyClass:IDisposable
{
static protected object _locker = new object();
protected bool isDisposed = false;
public MyClass()
{
Monitor.Enter(_locker);
}
public void Dispose()
{
if (!isDisposed)
{
Monitor.Exit(_locker);
GC.SuppressFinalize(this);
isDisposed = true;
}
}
~SPInstances()
{
Dispose();
}
public void doStuff()
{
if(isDisposed) throw new ObjectDisposedException();
// do stuff here, etc.
}
}
次に、次のように使用できます。
using(MyClass myinstance = new MyClass())
{
myInstance.doStuff();
myInstance.doStuff2();
}
次に、使用中にコードをラップするのを忘れたとしても、ロックされ、ガベージコレクション中にロックが解除される可能性があります...
私は C# に精通しておらず、いくつかの側面を見落とすこともあります。また、スレッド化は後でデバッグするのが容易ではないため、順調に進んでいるかどうか疑問に思っています。それは私の目標を達成するための適切な方法ですか?
編集:
Master Morality のアイデアを拡張しますが、この方法の方がよいでしょうか (リソースのインスタンスが 1 つしか必要ないため、少し単純化しました)?
public class MyClass
{
static protected readonly MyResourceType _myResourceStatic = new MyResourceType();
static public void DoWork(Action<MyClass> action)
{
lock(_myResource)
{
action(new MyClass(_myResource));
}
}
protected MyClass(MyResourceType myResource)
{
_myResource = myResource;
}
protected readonly _myResource;
public void DoFirstThing() { ... }
public void DoSecondThing(){ ... }
}
MyClass.DoWork(x =>
{
x.DoFirstThing();
// do unrelated stuff
x.DoSecondThing();
});