Monitor.TryEnter with Generic Class

У меня есть ситуация, когда для тестирования я хочу, чтобы мой метод таймера (FooMethod )запускался только по одному. В приведенном ниже примере FooMethod передается в качестве делегата таймеру. Есть много конкретных экземпляров этого класса. Я думал, что если сделать _шкафчик статическим, за раз будет обрабатываться только один экземпляр 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);
        }
    }
}

Примечание :Обычно _шкафчик не является статическим; Я не хочу, чтобы один и тот же поток входил в метод до того, как он сможет завершиться. Я изменил его на статический здесь для тестирования.

Моей первой мыслью было, что, может быть, это не работает, потому что класс является универсальным? И что каждый конкретный класс на самом деле является отдельным классом, и они не используют переменную шкафчика _? Это правда? Если это правда, как мне сделать, чтобы конкретные классы совместно использовали переменную шкафчика _? Нужно ли добавлять статическую переменную шкафчика _в какой-то другой класс, к которому у Foos есть доступ?

7
задан Bob Horn 16 April 2012 в 20:20
поделиться