2012-03-27 6 views
0

Zum Herunterladen einer Reihe von Bildern mache ich DownloadDataAsync-Aufrufe, um Instanzen von WebClient in einer Schleife mit einer Thread-Einschlafverzögerung zu trennen. Ich habe erwartet, dass die Antwort auf separaten Threads passieren wird, aber es scheint nicht, da die Antwort nur auftritt, nachdem alle Aufrufe abgeschlossen sind.Wie bekomme ich Multi-Thread-Antwort vom WebClient DownloadDataAsync, (oder alternativ)?

Also, was ist eine geeignete Lösung dafür? Gibt es einen alternativen Clienttyp oder sollte ich für jeden Webclient-Aufruf einen Thread erstellen?

So bin derzeit Aufruf ich dies in einer Schleife:

Private Sub StartDownload(ByVal webImageLink As String, ByVal token As Object) 
    Dim wc As New WebClient 
    Try 
     AddHandler wc.DownloadDataCompleted, AddressOf OnDownloadCompleted 

     wc.DownloadDataAsync(New System.Uri(webImageLink), token) 

     Threading.Thread.Sleep(delay) 

    Catch ex As Exception 
     Debug.Print("Exception in ImageDownloader.DoDownload ") 
    End Try 
End Sub 
+0

könnten Sie einen Code schreiben? – Strillo

+0

@Strillo, fertig, ich nehme an das ist alles das ist relevant .. – bretddog

Antwort

1

Eigenschaft, nicht einen Fehler. Der WebClient versucht, das DownloadCompleted-Ereignis im selben Thread zu starten, sofern dies möglich ist. Es kann, wenn Sie es aus dem UI-Thread einer Winforms- oder WPF-Anwendung aufrufen. Was normalerweise wünschenswert ist, können Sie die Benutzeroberfläche im Completion-Event-Handler aktualisieren, ohne Control/Dispatcher.BeginInvoke() zu verwenden. Aber mit dem Nebeneffekt, dass dies nicht passieren wird, bis der Code nicht mehr läuft, damit der Event-Handler aufgerufen werden kann. Es wird von der Dispatch-Schleife des UI-Threads ausgelöst.

Eine Abhilfe, wenn Sie wirklich eine benötigen, ist, die Downloads mit einer kleinen Hilfsmethode zu starten, die Sie mit ThreadPool.QueueUserWorkItem() oder einem Thread starten.

+0

Danke! Jetzt ThreadPool verwenden. Darf ich nur fragen, wenn ich es nicht getan habe, und ein paar hundert MB Bilder von etwa 5-10000 Anrufen heruntergeladen habe, wo würde sich diese Erinnerung "anhäufen", und würde das als eine schlechte Praxis angesehen werden? (Nicht in Betracht ziehen UI Freeze) – bretddog