Anwendung hängt sich auf beim Zugriff über ein Netzwerk

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Anwendung hängt sich auf beim Zugriff über ein Netzwerk

    Hallo zusammen,

    ich habe ein Problem mit einer Anwendung. Kurze Erklärung:
    Die Anwendung durchsucht ca. 10000 Textdatein a 1000 Zeilen Code nach einem Bestimmten Anfangsberiff zusammen mit dem gesuchten Schlagwort. Wenn ich jetzt aber die Anwendung laufen lasse hängt sie sich auf soblad ich ein Fenster verschieben will oder sonst irgendeine Aktivität auf der Anwendugn anklicke. Nicht immer, aber es kommt schon ab und an mal vor. Besonders verstärkt wenn ich es über ein Netztwerk suchen lasse und nicht lockal auf meinem Laptop.
    Kann es sein dass diese zu vearbeitende Datenmenge zuviel ist für mein kleines Tool?

    Hier der Code. Ich habe jetzt mal versucht das Prg. einfrieren zu lassen wenn die Suchfunktion ausgelöst wird. Von meinem Gedankengang her kann er dann in der Zeit sich mit dem Netzwerk verbinden. Aber das hat nicht so geklappt wie ich das dachte. hahahaha

    VB.NET-Quellcode

    1. Private Sub btnsuchen_Click(sender As Object, e As EventArgs) Handles btnsuchen.Click
    2. 'System.Threading.Thread.Sleep(100)
    3. If txtsuchen.TextLength = 4 Then
    4. If rbtn21.Checked = True Then
    5. ListBox21.Items.Clear()
    6. ProgressBar1.Value = 0
    7. Dim fInfo21 = New IO.DirectoryInfo(Pfadprg21).GetFiles("*.dat", IO.SearchOption.AllDirectories)
    8. ProgressBar1.Invoke(New MethodInvoker(Sub() ProgressBar1.Maximum = fInfo21.Length))
    9. For Each fi21 In fInfo21
    10. For Each line In IO.File.ReadAllLines(fi21.FullName)
    11. Dim parts = line.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
    12. line = line.Replace(" ", "")
    13. If line.StartsWith("75" & txtsuchen.Text) Then
    14. ListBox21.Items.Add(fi21.Name.Replace(fi21.Extension, ""))
    15. Exit For
    16. End If
    17. Next
    18. ProgressBar1.Invoke(New MethodInvoker(Sub() ProgressBar1.Increment(1)))
    19. Next
    20. End If


    Jemand ne Idee?
    Ne hab ich ja auch nicht verstanden.
    Jetzt nachdem du es sagst wird es klar, vorher war es über eine funktion.

    Sind das Dinge an denen sich die Anwendung aufhängen kann?

    VB.NET-Quellcode

    1. If rbtn21.Checked = True Then
    2. ListBox21.Items.Clear()
    3. ProgressBar1.Value = 0
    4. Dim fInfo21 = New IO.DirectoryInfo(Pfadprg21).GetFiles("*.dat", IO.SearchOption.AllDirectories)
    5. ProgressBar1.Maximum = fInfo21.Length
    6. For Each fi21 In fInfo21
    7. For Each line In IO.File.ReadAllLines(fi21.FullName)
    8. Dim parts = line.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
    9. line = line.Replace(" ", "")
    10. If line.StartsWith("75" & txtsuchen.Text) Then
    11. ListBox21.Items.Add(fi21.Name.Replace(fi21.Extension, ""))
    12. Exit For
    13. End If
    14. Next
    15. ProgressBar1.Increment(1)
    16. Next


    dann sieht jetzt so aus, so richtig?

    Mit Tasks oder Threads hat das nichts zu tun. Google doch einfach vb.net task respektive vb.net multithreading. Da findest Du wirklich genug Infos zu.
    Was Du aber dabei berücksichtigen musst ist, dass Du dann nicht einfach auf Winform Elemente zugreifen darfst. Statt eine Listbox zu füllen könntest Du eine List of FileInfo füllen und diese nach dem Funktionsende an die aufrufende Funktion zurück übergeben.

    Wenn die GUI beschäftigt ist, und Du beschäftigst sie recht lang, kann in diesem GUI Thread halt nichts mehr passieren, bis die Funktion abgearbeitet ist. Sie hat den Anschein sich aufgehangen zu haben, was aber nicht stimmt.
    Um die GUI von zeitintensiven Prozessen zu entlasten, also um auf Benutzeringaben oder auch nur um auf das Verschieben der Form noch reagieren zu können, muss der GUI Thread dazu auch frei sein. Das geht über Multithreading respektive das Auslagern von Funktionen in Tasks. Aus diesen anderen Threads oder Tasks heraus solltest Du aber vermeiden auf die GUI zuzugreifen. Es geht zwar über Invoke, aber dennoch solltes Du die Daten von der GUI trennen.
    Ich bin da kein guter Erklärer, es gibt hier etliche die das viel besser können. Aber das wäre, grob gezeichnet, der Weg.