myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Wie kann ich auf eine Bedingung oder einen Timeout warten?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich auf eine Bedingung oder einen Timeout warten?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
DiViP
myCSharp.de-Mitglied

Dabei seit: 22.05.2009
Beiträge: 26
Entwicklungsumgebung: Visual Studio 2012 Premium


DiViP ist offline

Wie kann ich auf eine Bedingung oder einen Timeout warten?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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;
}
08.11.2019 16:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.182
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
08.11.2019 16:56 Beiträge des Benutzers | zu Buddylist hinzufügen
DiViP
myCSharp.de-Mitglied

Dabei seit: 22.05.2009
Beiträge: 26
Entwicklungsumgebung: Visual Studio 2012 Premium

Themenstarter Thema begonnen von DiViP

DiViP ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
08.11.2019 19:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


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