none
Form is not responding - Async CTP v3 RRS feed

  • Frage

  • Hi all,

    I'd played around with the new Async CTP v3 and try to list all files and its subdirectories asyncronously and show this progress by using a progress bar.

    Most of the code works fine, but just in the moment I list all entries my Windows form is not responding. What I'm doing wrong?

    Below my source code:

    Greetings

    Peter

    Imports System.IO
    Imports System.Threading
    Imports System.Threading.Tasks
    Imports System.Collections.ObjectModel
    Imports System.Net

    Public Class Form1

        Private Async Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

            'Clear all entries
            Me.ProgressBar1.Value = 0
            Me.ListBox1.Items.Clear()

            'Define progress
            Dim progress As New Progress(Of NumberEntries)

            'Define ProgressBar
            Me.ProgressBar1.Minimum = 0
            Me.ProgressBar1.Maximum = 100

            'Handler
            AddHandler progress.ProgressChanged, AddressOf ShowProgress

            'Call
            Await TaskEx.Run(Function() Auflistung("C:\windows", progress))

        End Sub

        Public Shared Function Auflistung(ByVal dir As String, ByVal progress As IProgress(Of NumberEntries)) As Task(Of String())

            Dim Direc As New DirectoryInfo(dir)
            Dim Files() As FileInfo
            Dim I As Long = 0

            Files = Direc.GetFiles("*.*", SearchOption.AllDirectories)

            For I = 0 To Files.GetUpperBound(0) - 1

                progress.Report(New NumberEntries With {.Count = (I / Files.GetUpperBound(0)), .Eintrag = Files(I).ToString})

            Next

        End Function

        Public Class NumberEntries

            Public Count As Long
            Public Eintrag As String

        End Class

        Public Sub ShowProgress(source As Object, e As Object)

            Me.ProgressBar1.Value = e.Count * 100
            Me.ListBox1.Items.Add(e.eintrag)

        End Sub

    End Class


    Samstag, 24. Dezember 2011 09:51

Antworten

  • Hallo Peter,

    auch ohne jetzt den Code mit Async CTP ausgeführt zu haben:

    Durch das Hinzufügen der Einzelelemente wird jedes Mal die Listbox aktualisiert.
    Eine Verbesserung wäre, am Anfang BeginUpdate und zum Abschluss EndUpdate aufzurufen.
    Wobei auch das (unnötig) viele ReportProgress Aufrufe verursacht.

    Am effizientesten dürfte es sein, die gesamte Auflistung zurückzugeben
    und über die DataSource an die Listbox zu binden.

    Falls es mehr als nur als eine Anzahl werden soll zeigt u. a.
    Gewusst wie: Iterieren von Dateiverzeichnissen mit PLINQ
    weitere Möglichkeiten.

    Ergänzung:
    Zur Blockierung lies: Await, and UI, and deadlocks! Oh my!

    was aber nichts ändert, dass Du viele Thread-Kontextwechsel zum UI Thread hast,
    und so letztendlich den UI-Thread überfrachtest.

    Gruß Elmar

     


    Samstag, 24. Dezember 2011 10:40
    Beantworter

Alle Antworten