Ich habe eine Windows-Dienstanwendung, die eine Threading.Timer
und eine TimerCallback
verwendet, um einige Verarbeitung in bestimmten Intervallen zu tun. Ich muss diesen Verarbeitungscode auf nur 1 Thread gleichzeitig sperren.Verwenden der Sperre mit Threading.Timer
So zum Beispiel wird der Dienst gestartet und der erste Rückruf wird ausgelöst und ein Thread wird gestartet und beginnt mit der Verarbeitung. Dies funktioniert solange die Verarbeitung vor dem nächsten Callback abgeschlossen ist. Nehmen wir zum Beispiel an, dass die Verarbeitung etwas länger als gewöhnlich dauert und der TimerCallback erneut ausgelöst wird, während ein anderer Thread verarbeitet wird. Ich muss diesen Thread warten lassen, bis der andere Thread fertig ist.
Hier ist eine Probe von meinem Code:
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
}
}
Ist dies ein sicherer Weg, dies zu tun? Was passiert, wenn die Warteschlange ziemlich umfangreich wird? Gibt es eine bessere Option?
Nette Idee mit dem Auslösen der Timer nie darüber auf diese Weise gedacht. Das zweite Szenario bedeutet, dass der Thread einfach beendet wird und nicht wartet? – James
Ja, im zweiten Szenario kehrt der TryEnter sofort zurück, wenn es einen anderen Thread gibt, der sich gerade im Verarbeitungscode befindet, also überspringt er das Timer-Intervall. –
Dies sollte den Trick tun, danke. – James