我遇到一种情况,在测试中,我只希望我的计时器方法(FooMethod)一次运行一次。在下面的示例中,FooMethod作为委托(delegate)传递给计时器。该类有许多具体实例。我认为通过将_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可以访问的其他某个类中?
最佳答案
是的。
每个具有不同Foo<T>
参数的封闭T
类型都有其自己的静态_locker对象。您可以使Foo从基类继承,然后将静态对象放在那里。然后,所有类型都将使用相同的实例。