Ein Event innerhalb einer Schleife, wie die Schleife fortsetzen?

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Ein Event innerhalb einer Schleife, wie die Schleife fortsetzen?

    Hallo,

    ich habe mal eine grundsätzliche Frage. Ich habe eine Schleife, die z.B. über 8 Werte geht. Jeder dieser Werte wird seriell abgeschickt und dann kommt eine Antwort, in eine DataReceived-Event, welches in einem eigenen Thread läuft. Nur, wie mache ich es am saubersten, dass nach dieser Antwort wieder der nächste Wert rausgeschickt wird?
    Ich kann natürlich eine Boolean-Variable einführen, die ich in While-Schleife innerhalb der Schleife abfrage und erst dann losgehe, wenn sie im Event gesetzt wurde. Aber ich dachte, es geht bestimmt irgendwie besser...

    LG
    jo, dassis traditionellerweise halt so bisserl umständlich, wie dir eiglich schon klar ist.

    aber seit 2013 wird mittm Async-/Await- Schlüsselwort ein neuer Pattern asynchroner Programmierung unterstützt. Sollte man sich unbedingt aneignen.

    Leider kann ich kein Codesample, weil nur 2010 :(

    Das einzige, was in die Richtung geht ist picoflops Tutorial: [VB 2012] Warten auf ein Ereignis
    naja - soo schlimm ists auch nicht.
    Wenn du die Datensätze in einer Auflistung sammelst, und davon einen Enumerator(Of T) als Klassenvariable nimmst, kannst du eiglich ganz bequem in jedem DownloadComplete den nächsten Download starten.

    ist ungewohnt, aber doch recht praktisch.
    In [link url="http://www.vb-paradise.de/allgemeines/tipps-tricks-und-tutorials/allgemein/85835-extensions-fuer-listen/#post705747"]Extensions für Enumeratoren[/link] wird auch bisserl mit so Enumeratoren gearbeitet, aber das Haupt-Thema (endlos-Enumeration) ist für dich wohl grad nicht verwendbar.
    Mir ist noch gerade eingefallen, dass ich eben diese Werte in einer Auflistung speichern kann und dann einfach den Index in die Funktion übergebe.
    Also zuerst die Funktion mit Index 0 starten. Dann im Event den Index erhöhen und von da die Funktion mit dem nächsten Index aufrufe. Bis der Index voll ist.

    Meinst du so was auch gerade?
    Hey,

    ich würde den gesamten Vorgang in eine Klasse packen. Du liegst ganz richtig damit, dass, wenn Du eine Antwort bekommen hast, Du den Index innerhalb der Auflistung einfach um 1 weiter setzt. Hier zu kannst die Liste auch durch einen

    Stack(Of ...)

    tauschen. Dann entfällt das Gefummel mit dem Index. Musst nur aufpassen, in welcher Reihenfolge Du die Daten auf diesen Stack legst. Beim Eintreffen einer Antwort von der Schnittstelle prüfst Du einfach, ob der Stack leer ist. Wenn ja => Arbeit beendet und Event an das Hauptprogramm absetzen, wenn nein => das nächste Item vom Stack holen.

    Der Klasse kannst eine Referenz auf einen Serialport mitgeben und eben die Daten, die verarbeitet werden sollen. Im Hauptprogramm wartest Du nur einfach auf das Event, dass alle Daten abgearbeitet sind. So wäre mein Gedankengang.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Im Endeffekt nicht viel anders, als ich es meine, nur ausgelagert. Eigentlich ist es nicht mal mein Projekt, ich helfe hier jemand bei Abschlussarbeit (offiziell), es ist jetzt sowieso schon viel zu kompliziert (DataSet, gebundene Daten usw :P ) dafür, dass es eigentlich Hardwerker sind.

    Ich denke, ich mache es dann mit der List (ist für sie bestimmt auch einfacher zu verstehen), ich prüfe bei der Antwort ja auch, ob der Index schon List.Length-1 ist.

    Es ist nämlich so, dass wenn die Antwort kommt, eigentlich erst noch an ein anderes Gerät (per USB dann) was geschickt wird und auch da Antwort ausgewertet wird. Erst dann geht es wieder von vorne los...