我遇到一种情况,在测试中,我只希望我的计时器方法(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从基类继承,然后将静态对象放在那里。然后,所有类型都将使用相同的实例。

09-27 08:37