テストのために、タイマー メソッド (FooMethod) を一度に 1 つだけ実行したい状況があります。以下の例では、FooMethod がデリゲートとしてタイマーに渡されます。このクラスには多くの具象インスタンスがあります。_locker を static にすることで、一度に処理される FooMethod() のインスタンスは 1 つだけになると思いました。しかし、アプリを実行すると、一度に複数のスレッドが TryEnter() 行を通過します。
これは、各クラスを新しいタイマーに追加する方法です。これは、各 foo インスタンスに対してループで行われます。
_timers.Add(new Timer(foo.FooMethod, null, 0, 10000));
そして、これはそのメソッドを持つクラスです:
public class Foo<T>
{
private static readonly object _locker = new object();
public void FooMethod(object stateInfo)
{
// Don't let threads back up; just get out
if (!Monitor.TryEnter(_locker)) { return; }
try
{
// Logic here
}
finally
{
Monitor.Exit(_locker);
}
}
}
注: 通常、_locker は静的ではありません。メソッドが完了する前に、同じスレッドがメソッドに入ることは望ましくありません。テストのために、ここで静的に変更しました。
私の最初の考えは、クラスがジェネリックであるため、これは機能していないのではないでしょうか? そして、各具象クラスは実際には独自のクラスであり、それらは _locker 変数を共有していませんか? 本当?それが本当なら、具象クラスに _locker 変数を共有させるにはどうすればよいですか? Foos がアクセスできる他のクラスに static _locker 変数を追加する必要がありますか?