Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie kann ich auf eine Bedingung oder einen Timeout warten?
DiViP
myCSharp.de - Member



Dabei seit:
Beiträge: 27

Themenstarter:

Wie kann ich auf eine Bedingung oder einen Timeout warten?

beantworten | zitieren | melden

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;
}

private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15806
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
DiViP
myCSharp.de - Member



Dabei seit:
Beiträge: 27

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers