У меня есть ситуация, когда для тестирования я хочу, чтобы мой метод таймера (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 есть доступ?