Hallo zusammen,
@ISliceUrPanties meinte neulich
Folgende Programmsituation: Ein Programm weist eine Klasseninstanz zu Programmbeginn an, vorhandene PDF-Rechnungsdateien zu parsen und daraus Positionsinstanzklassen zu erstellen (Artikelnummer, Packungszahl, Preise). Dies ist ein langsamer Prozess, da mithilfe einer weiteren DLL, die mit einer DB kommuniziert, diese Daten harmonisiert werden (Artikelname, etc.). Auch kann es sein, dass zu mehreren Zeitpunken an Tag weitere Rechnungen hinzukommen. Also langwierig. Zusammenfassend:
Denn ich habe bisher innerhalb von InvoiceContainer:
Aber wenn ich @ISliceUrPanties richtig verstehe, soll man es nicht so machen. Wie dann?
##########
Ja gut, die logische Schlussfolgerung:
@ISliceUrPanties meinte neulich
und verwies auf das TAP. Das schwirrt mir seit einigen Tagen im Kopf rum und ich komm zu keinem sinnvollen Ergebnis.ISliceUrPanties schrieb:
Asynchrone Methoden geben immer Task zurück, auch wenn man keinen eigentlichen Rückgabewert hat. Nur für EventHandler sollte "async void" verwendet werden.
Folgende Programmsituation: Ein Programm weist eine Klasseninstanz zu Programmbeginn an, vorhandene PDF-Rechnungsdateien zu parsen und daraus Positionsinstanzklassen zu erstellen (Artikelnummer, Packungszahl, Preise). Dies ist ein langsamer Prozess, da mithilfe einer weiteren DLL, die mit einer DB kommuniziert, diese Daten harmonisiert werden (Artikelname, etc.). Auch kann es sein, dass zu mehreren Zeitpunken an Tag weitere Rechnungen hinzukommen. Also langwierig. Zusammenfassend:
- Programm ruft InvoiceContainer auf
- InvoiceContainer sammelt alle PDF-Dateien zusammen (schnell)
- InvoiceContainer verwendet verschiedene Importer, um die Rechnungen verschiedener Lieferanten zu parsen (langsam, da PDF-Parsing)
- InvoiceContainer sammelt mithilfe einer DLL und der dahinterliegenden DB weitere Daten der gelieferten Artikel zusammen und ergänzt die so die fehlenden Item-Instanzdaten (langsam)
Denn ich habe bisher innerhalb von InvoiceContainer:
VB.NET-Quellcode
- Private Async Sub _ExtractInvoiceItemsFrom(Invoice As Invoice)
- ReportStartOfInvoiceProcessing(Invoice.InvoiceID) 'Info ans GUI, dass gerade was importiert wird
- Await Task.Run(Sub() ExtractItemsOf(Invoice))
- ReportEndOfInvoiceProcessing() 'Info ans GUI, dass der Import beendet ist
- End Sub
- Private Sub ExtractItemsOf(Invoice As Invoice)
- Dim FileLines = GetFileLinesOf(Invoice.FileInfo.FullName) 'schnell
- Dim InvoiceItemFileLines = GetInvoiceItemFileLinesFrom(FileLines) 'langsam
- InvoiceImporter.ExtractInvoiceItemsFrom(InvoiceItemFileLines, Invoice) 'langsam
- End Sub
Aber wenn ich @ISliceUrPanties richtig verstehe, soll man es nicht so machen. Wie dann?
##########
Ja gut, die logische Schlussfolgerung:
_ExtractInvoiceItemsFrom
wird von einer Sub
zu einer Function
mit Task
-Rückgabewert. Und der jeweilige EventHandler wird zur Async Sub
gemacht, der auf den Task wartet. Denn die Aufgabe (wie so wahrscheinlich ziemlich alle Methoden) wird ja immer irgendwie ursprünglich durch einen EventHandler ausgelöst. Egal, ob es MainForm_Load
ist, ein Timer, der tickt, ein Button, der geklickt wird oder ein FileSystemWatcher, der das Hinzukommen einer neuen PDF-File meldet. Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()