У меня есть приложение Windows Service, которое использует Threading.Timer
и TimerCallback
для выполнения определенной обработки с определенными интервалами. Мне нужно заблокировать этот код обработки только по одному потоку за раз.Использование блокировки с Threading.Timer
Так, например, служба запускается и запускается первый обратный вызов, и поток запускается и начинает обработку. Это работает нормально, пока обработка завершена до следующего обратного вызова. Так скажем, например, обработка занимает немного больше времени, чем обычно, и TimerCallback запускается снова, в то время как другой поток обрабатывается, мне нужно сделать этот поток до тех пор, пока не будет выполнен другой поток.
Вот пример моего кода:
static Timer timer;
static object locker = new object();
public void Start()
{
var callback = new TimerCallback(DoSomething);
timer = new Timer(callback, null, 0, 10000);
}
public void DoSomething()
{
lock(locker)
{
// my processing code
}
}
Является ли это безопасный способ сделать это? Что произойдет, если очередь станет достаточно существенной? Есть ли лучший вариант?
Хорошая идея с запуском таймеров никогда не задумывалась об этом. Второй сценарий, означает ли это, что поток просто выходит и не ждет? – James
Да, во втором сценарии TryEnter возвращается немедленно, если есть еще один поток, который в настоящее время находится в коде обработки, поэтому он эффективно пропускает этот интервал таймера. –
Это должно сделать трюк, спасибо. – James