我有一种情况,为了测试,我只希望我的计时器方法(FooMethod)一次运行一个。在下面的示例中,FooMethod 作为委托传递给计时器。这个类有很多具体的实例。我认为通过使 _locker 静态,一次只能处理一个 FooMethod() 实例。但是当我运行应用程序时,多个线程一次通过 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 变量?我是否需要将静态 _locker 变量添加到 Foos 可以访问的其他类?