none
async Methodenaufruf RRS feed

  • Frage

  • Hallo Leute,
    ich habe eine Klasse innerhalb dieser befindet sich eine Methode (Sub), die von einer externen asynchronen Komponente aufgerufen wird. Wichtig ist allerdings, dass die externe Komponente nicht durch die Sub blockiert wird.

    In dieser Sub gibt es nämlich GUI-Ausgaben und Datenbankzugriffe, die relativ langsam sind.

    Die asynchronen Aufrufe können relativ schnell hintereinander stattfinden sodass die Abarbeitung innerhalb der Sub von einem Aufruf zum anderen zu langsam ist.
    Es kann zwar sein, dass ein paar Aufrufe schnell hintereinander kommen aber die Aufruf-Anzahl im Gesamten ist nicht so oft, sodass die langsame Sub genügend Zeit hat diese abzuarbeiten.

    Lösungsversuch:
    Kann ich innerhalb der Sub, die ja asynchron aufgerufen wird, in einem (schnellen) Buffer die Sub-Aufrufe zwischenspeichern und diese dann vom Main-Thread synchron abarbeiten lassen?

    Vielen Dank im Voraus


    Christian Tauschek



    Mittwoch, 25. Januar 2023 07:07

Antworten

  • Hallo,

    man kannst Tasks auch in einer Liste speichern und sie dann aberbeiten wenn zeit dafür ist. Dazu kann man auch Threadsichere Auflistungen verwenden.

    Ein Beispiel mit einer List<T> findes Du hier Task.WaitAll


    Gruß Thomas
    Der Junior lernt täglich, um Senior zu werden.
    Der Senior lernt täglich, da er weiß, dass er immer Junior bleiben wird.
    Github

    Donnerstag, 26. Januar 2023 20:27
  • Hallo Christian,

    Deine Ausgangslage mit den mehreren Datenbankzugriffen kommt in einem gewissen Sinn einer mehrfachen Dateiein- und Dateiausgabe nahe, für die im folgenden Thread ein Threadpoolthread empfohlen wird:
    Proper way to convert a method to async that calls Write forty times?

    Dadurch lassen sich Parallelitätsprobleme vermeiden, weil der Rest des Programms aufgehalten wird, bis der Hintergrundthread (in Deinem Fall bspw. mit den Datenbankzugriffen) zu Ende ist. Es bleibt noch zu überlegen, wie die Ausgaben in der grafischen Benutzeroberfläche gestaltet werden können. Wenn Du jedoch den asynchronen Aufruf beibehalten möchtest, schau mal, ob die BufferedStream-Klasse, die im oben erwähnten Thread (wenn auch in den Kommentaren) besprochen wird, Dich weiterbringen könnte:
    BufferedStream Class

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 25. Januar 2023 18:37
    Moderator

Alle Antworten

  • Hallo Christian,

    Deine Ausgangslage mit den mehreren Datenbankzugriffen kommt in einem gewissen Sinn einer mehrfachen Dateiein- und Dateiausgabe nahe, für die im folgenden Thread ein Threadpoolthread empfohlen wird:
    Proper way to convert a method to async that calls Write forty times?

    Dadurch lassen sich Parallelitätsprobleme vermeiden, weil der Rest des Programms aufgehalten wird, bis der Hintergrundthread (in Deinem Fall bspw. mit den Datenbankzugriffen) zu Ende ist. Es bleibt noch zu überlegen, wie die Ausgaben in der grafischen Benutzeroberfläche gestaltet werden können. Wenn Du jedoch den asynchronen Aufruf beibehalten möchtest, schau mal, ob die BufferedStream-Klasse, die im oben erwähnten Thread (wenn auch in den Kommentaren) besprochen wird, Dich weiterbringen könnte:
    BufferedStream Class

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 25. Januar 2023 18:37
    Moderator
  • Hallo,

    man kannst Tasks auch in einer Liste speichern und sie dann aberbeiten wenn zeit dafür ist. Dazu kann man auch Threadsichere Auflistungen verwenden.

    Ein Beispiel mit einer List<T> findes Du hier Task.WaitAll


    Gruß Thomas
    Der Junior lernt täglich, um Senior zu werden.
    Der Senior lernt täglich, da er weiß, dass er immer Junior bleiben wird.
    Github

    Donnerstag, 26. Januar 2023 20:27