Używanie blokady z Threading.Timer
Mam aplikację usługi Windows, która używaThreading.Timer
i aTimerCallback
wykonać pewne przetwarzanie w określonych odstępach czasu. Muszę zablokować ten kod przetwarzania tylko na 1 wątku naraz.
Na przykład usługa jest uruchamiana i uruchamiane jest pierwsze wywołanie zwrotne, a wątek jest uruchamiany i rozpoczyna przetwarzanie. Działa to poprawnie, dopóki przetwarzanie zostanie zakończone przed następnym wywołaniem zwrotnym. Powiedzmy na przykład, że przetwarzanie trwa trochę dłużej niż zwykle, a funkcja TimerCallback jest uruchamiana ponownie, podczas gdy inny wątek przetwarza, muszę sprawić, aby wątek czekał, aż drugi wątek zostanie wykonany.
Oto przykład mojego kodu:
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
}
}
Czy to bezpieczny sposób na zrobienie tego? Co się stanie, jeśli kolejka stanie się dość duża? Czy jest lepsza opcja?