none
Textdatei auslesen dauert sehr lange und blockiert dadurch die Hauptanwendung RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein einfaches Programm in VB geschrieben, welches Daten aus einer Textdatei ausliest und diese nach bestimmten Kriterien durchsucht. Soweit funktioniert alles fehlerfrei, aber die Textdatei ist mitunter sehr groß, die Ladezeit dadurch sehr lang. Problem ist, das der Benutzer während dessen mit der Hauptanwendung nicht arbeiten kann. Wie kann ich realisieren, das die Textdatei im Hintergrund ausgelesen wird und der Nutzer trotzdem mit der Anwendung arbeiten kann? Hat jemand einen Tipp?

    VG Oli

    Montag, 19. Januar 2015 16:01

Antworten

Alle Antworten

  • Hallo,
    dafür musst du das Verarbeiten der Datei in einen 2. Thread auslagern. Dafür bietet sich beispielsweise der BackgroundWorker an. Mit diesem (oder einer der anderen Threadbasierten Klassen) kannst du dann die Datei parallel zur GUI verarbeiten. Du musst dabei natürlich beachten, das der Benutzer nicht ein 2. mal auf die Datei zugreift etc.

    PS: Weiterhin müssen Zugriffe auf die GUI aus einem anderen Thread u.U. über die Invoke-Methode (WinForms) oder den Dispatcher (WPF) erfolgen. Das hat den Hintergrund, dass immer nur der GUI trhead auch auf die GUI zugreifen darf. Über die jeweiligen Technologien werden die Threads kurzzeitig synchronisiert und alles läuft wieder nacheinander ab.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Montag, 19. Januar 2015 16:09
    Moderator
  • Du kannst neben dieser Technik auch das async schlüsselwort verwenden.

    Dadruch wird der Vorgang so ausgeführt, dass die Benutzeroberfläche nicht geblockt wird.

    Hier steht, wie man es macht: async


    © 2015 Thomas Roskop

    Germany // Deutschland

    Dienstag, 20. Januar 2015 13:43
  • Hallo zusammen,

    ein spätes Feedback zur Lösung: habe den Backgroundworker eingesetzt. Habe die eigentliche Abfrage (beinhaltet die Speicherung der Daten in einer SQL DB) in eine Funktion ausgelagert. Die hat als Rückgabewert nur ob alles funktioniert hat und wenn nicht den Fehler. Der Rückgabewert wird in e.Result gespeichert, so das ich den dann später anzeigen kann. Direkt aus der Funktion (= aus dem anderen Thread) funktioniert es nicht. 

    Danke für die Hilfe, VG Oli Berger

    Mittwoch, 11. März 2015 15:22