シングルトーン オブジェクトへのアクセスを制限しようとしているので、一度に 1 つのスレッドだけがそれを使用します。さらに、同じスレッドが制限されたコードに 2 回アクセスするのを防ぎたいです。
Lock メソッドを試してみたところ、彼女をロックしたスレッドはロックされず、他のスレッドのみがロックされることがわかりました..
以下のように:
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
static Singleton()
{
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
public class SomeWorker
{
private readonly Timer _doWorkTimer = new Timer(20);
public SomeWorker()
{
InitiateTimer();
}
private void InitiateTimer()
{
_doWorkTimer .Elapsed += DoWorkElapse;
_doWorkTimer .Enabled = true;
}
private void DoWorkElapse(object source, ElapsedEventArgs e)
{
DoSomeWork();
}
private void DoSomeWork()
{
// I know that lock on string is wrong!
// Its just for the example only I
// Its just to make sure all the program is use the same lock..
lock ("ConnectionLock")
{
Console.WriteLine("Lock");
var inst = Singletone.Instance;
// Do Some Work on "inst" ...
Console.WriteLine("Unlock");
}
}
}
たとえば、コンソールの結果は次のようになります。
. . .
ロック
ロック解除
ロック
ロック
ロック解除
. . .
ご覧のとおり、2 つの Lock コメントが次々と表示されます
つまり、「DoSomeWork()」がタイマー スレッドによって 2 回アクセスされることを意味します。
このロックを機能させる方法を知っている人はいますか?
他の同期方法はありますか?
ありがとう。