Beim einlesen einer großen Textdatei hängt es

  • WPF

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

    Beim einlesen einer großen Textdatei hängt es

    Hallo,
    erstmal Entschuldigung, dass ich jetzt fast täglich irgendwelche, für manche vielleicht dämliche, Fragen habe. Aber ok, das hier ist ein Forum, nun zu meinem Problem: Ich habe vor, eine > 50 MB große Textdatei einzulesen. Bei WinForms kein Problem, jedoch laggt es bei WPF total. Das ist mein Code, der bei WinForms sehr flüssig läuft, aber bei WPF total hängt:

    VB.NET-Quellcode

    1. Dim file As New FileInfo("MeineGroßeTextDatei")
    2. Dim t As New System.Threading.Thread(Sub()
    3. Using fs As New System.IO.FileStream(file.FullName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)
    4. Using sr As New StreamReader(fs)
    5. Do While Not sr.EndOfStream
    6. Me.Dispatcher.Invoke(Sub() RichtTextBox.AppendText(sr.ReadLine & Environment.NewLine))
    7. Loop
    8. End Using
    9. End Using
    10. End Sub)
    11. t.Priority = System.Threading.ThreadPriority.Highest
    12. t.Start()


    Woran liegt das und gibt es eine Möglichkeit, dass bei WPF auch schön flüssig immer mehr Text dazukommt? Oder geht das vielleicht irgendwie ganz schnell auf einen Schlag wie bei Notepad++?


    (ja, ich weiß, dass ein Lag die Verzögerung zwischen Server und Client ist, aber für mich ist 'laggen' hängen.)
    Mfg
    Vincent

    das ist doch Threading, wasserda versucht. Mein Vorschlag:

    VB.NET-Quellcode

    1. Dim file As New FileInfo("MeineGroßeTextDatei")
    2. Dim t As New System.Threading.Thread(Sub()
    3. Using sr As StreamReader = file.OpenText
    4. Me.Dispatcher.BeginInvoke(Sub() RichtTextBox.AppendText(sr.ReadToEnd))
    5. End Using
    6. End Sub)
    7. t.Priority = System.Threading.ThreadPriority.Highest
    8. t.Start()
    @ErfinderDesRades
    Jap, das hab ich auch erstmal als Notlösung genommen, aber obwohl das ganze in nem Thread ist, hängt die Form die ganze Zeit. Es wäre ja ok, wenn der Text dann irgendwann kommt und man blendet solange ne unendliche Animation ein, aber so geht das ja gar nicht... Bin an der Überlegung, ob ich für die Textdatei eine eigene Anwendung (in WinForms) schreibe...

    @enIking1998
    Das macht glaube keinen Unterschied, außer das ReadLines nicht unterstützt, dass man Textdateien öffnet, die in Benutzung sind...
    Mfg
    Vincent

    Lies den Text erst asynchron aus, und schreibe ihn dann synchron in die RTB rein. Denn so, wie du das im Moment machst, bringt das nicht sonderlich viel - da kann man sich den extra Thread auch fast sparen ;)
    50MB sind sicher recht viel für die Richtextbox, aber sofern sich das in VB.Net nicht viel von VB6 unterscheidet wird das Problem
    wohl die Schleife sein in der du jede Zeile einzeln der Richtextbox hinzufügst.

    Immerhin handelt es sich hier um eine große Datei mit wahrscheinlich abertausenden von Zeilen.
    Und jedesmal nach dem einfügen einer Zeile wird die RTB aktualisiert.

    Bei VB6 konnte man das mit dem ausblenden des Controls verhindern.
    Es gibt aber auch ne API die LockWindowUpdate oder so ähnlich heißt.

    Aber ich denke mal das leichteste wird sein, du liest das ganze erstmal komplett in eine Variable ein und übergibst erst danach den kompletten Text an die RTB.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cane“ ()

    Ja, genau das habe ich auch vorhin ausprobiert, gleiches Problem. Ich nehm dafür jetzt ein eigenes WinForms Projekt. Ich lasse den Thread aber noch offen, für den Fall, das jemand noch ne Lösung hat.
    Mfg
    Vincent

    WPF verwendet bei großen Datenmengen einen virtualisierungs Mechanismus. Dieser wird z.B. von der ListBox,... unterstützt. Ob dieser von der RTB auch unterstützt wird weiß ich nicht. Wenn nicht, müsstest du dir selbst sowas basteln. Das heißt: Text in Blöcke aufteilen und je nach dem wie viel Text du brauchst(also sichtbar ist) darstellen. Ansonsten weiß ich zu 100%, dass AvalonEdit dies macht: codeproject.com/Articles/42490…valonEdit-WPF-Text-Editor


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.