myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Grundlagen von C# (https://www.mycsharp.de/wbb2/board.php?boardid=88)
--- Wie kann ich auf eine Bedingung oder einen Timeout warten? (https://www.mycsharp.de/wbb2/thread.php?threadid=122344)


Geschrieben von DiViP am 08.11.2019 um 16:53:
  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?

C#-Code:
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;
}


Geschrieben von Abt am 08.11.2019 um 16:56:
 
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.


Geschrieben von DiViP am 08.11.2019 um 19:22:
 
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.


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.11.2019 15:23