Laden...

Wie kann ich auf eine Bedingung oder einen Timeout warten?

Erstellt von DiViP vor 4 Jahren Letzter Beitrag vor 4 Jahren 903 Views
D
DiViP Themenstarter:in
27 Beiträge seit 2009
vor 4 Jahren
Wie kann ich auf eine Bedingung oder einen Timeout warten?

Ich brauche eine Methode die solange wartet bis eine eigene Bedingung erfüllt ist oder ein Timeout auftritt. Gibt es da was im Framework bei dem ich eine Bedingung, Intervall und Timeout setzen kann?
Die Funktion sollte auch kein DateTime.Now benutzen, da eine Umstellung der Rechnerzeit die Laufzeit beeinflusst. Alternative wäre Stopwatch was intern auch Datetime benutzt bzw. einen QueryPerformanceCounter, bei dem ich aber nicht weiß ob dieser auch von der Rechnerzeit abhängig ist.
Oder kurz gesagt, wie kann man folgenden Code eleganter umsetzen?

            
public Boolean WaitFor(Func<Boolean> condition, TimeSpan timeout)
{
    var startTime = DateTime.Now;
    do
    {
        if (condition?.Invoke())
        {
            return true;
        }

        Thread.Sleep(100);
    }
    while ((DateTime.Now - startTime) < timeout);
    return false;
}


16.807 Beiträge seit 2008
vor 4 Jahren

Warum brauchst Du das? Erklär bitte was Du vor hast, vermutlich gibt es eine bessere Lösung.
"Warten" ist in 99,99999% ein Konzeptfehler. Deines so würde den gesamten Thread blockieren.

D
DiViP Themenstarter:in
27 Beiträge seit 2009
vor 4 Jahren

Vielen Dank für die Antwort. Da stimme ich Dir vollständig zu und auf einer grünen Wiese würde der Code nicht benötigt werden.

Es handelt sich hierbei aber um nach C# portierten Code der weiterhin aus einer nativen Anwendung in einem CLR-Host aufgerufen wird. Async und await wird hier nicht möglich sein.
Der Code der nativen Anwendung soll nicht angepasst werden und der aufrufende Thread muss in diesem Fall blockiert werden, bis die Bedingung erfüllt ist bzw. ein Timeout stattfindet.

Konkret in diesem Fall wird damit eine spezielle Semaphore implementiert. Bestimmter Code soll nicht parallel aufgerufen werden. In diesem Fall würde ein Lock mit Timeout ausreichen, aber der Aufrufer darf sich per Parameter darüber hinweg setzen und Code dennoch parallel ausführen. Er muss aber dabei dennoch in der Semaphore erfasst werden, so dass weitere Aufrufer blockiert werden.