Benutzer mit den meisten Antworten
Form is not responding - Async CTP v3

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
- Bearbeitet Peter Schirmer 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
- Bearbeitet Elmar BoyeEditor Sonntag, 25. Dezember 2011 10:42 Ergänzung
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 27. Dezember 2011 10:25
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 4. Januar 2012 13:04
Alle 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
- Bearbeitet Elmar BoyeEditor Sonntag, 25. Dezember 2011 10:42 Ergänzung
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 27. Dezember 2011 10:25
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 4. Januar 2012 13:04
-
Hallo Peter Schirmer,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.