C# Methode nur 1x zur Zeit ausführen, sonst return?
Ich stelle mir etwas dieser Art vor:
bool lockActive = False;
public void OnStartClick()
{
if (lockActive)
{
return;
}
lockActive = true;
// Do something in critical section
lockActive = false;
}
Da OnStartClick mehrfach gleichzeitig ausgeführt werden kann (Siehe unten warum), muss das Locken atomar passieren.
Ein richtiges (async-)Lock kann ich nach meinem Verständnis aber nicht verwenden, da die Threads warten würden, statt zu returnen.
Wie kann ich das umsetzen?
( Wozu ich das brauche: )
Task A (UI) startet Task B beim Knopfdruck.
Zum erneuten Starten muss A erst B beenden. Dazu nutzt A ein Cancel-Token und wartet auf Beenden von B.
Das Warten auf B muss allerdings soweit ich weiß asynchron passieren, da sonst außer A auch B blockiert wird, da sie im gleichen Threadpool sind -> Deadlock.
Dadurch, dass asynchron gewartet wird, kann es aber passieren, dass durch mehrfaches Drücken mehrere Tasks auf das Beenden warten. Ich möchte aber, dass maximal einer wartet.
Das könnte ich umgehen, indem ich Threads außerhalb des Threadpools verwende.
Geht es aber vielleicht auch so?
1 Antwort
Um sicherzustellen, dass eine Methode in C# nur einmal gleichzeitig ausgeführt wird, kannst du eine "lock" -Anweisung verwenden. Die "lock" -Anweisung sperrt ein Objekt und führt den Codeblock, der darauf folgt, atomar aus, was bedeutet, dass der Codeblock für andere Threads blockiert wird, bis er abgeschlossen ist. Hier ist ein Beispiel:
private object _lockObject = new object();
public void MyMethod() {
lock (_lockObject) {
// Code, der nur einmal gleichzeitig ausgeführt werden soll
}
}
Gerade wollte ich schreiben, dass ich ja geschrieben habe, warum ich kein Lock verwenden kann.
Aber dann ist mir zum Glück noch aufgefallen, dass du Recht hast und ich das Lock nur an anderer Stelle verwenden muss als ich dachte und die eigentliche critical section ja der obere Teil der Methode ist.
Danke!