2012-03-27 14 views
0

多数の画像をダウンロードするには、WebClientの個別のインスタンスにDownloadDataAsync呼び出しを行います。ループでは、スレッドのスリープ遅延が発生します。応答は別のスレッドで発生すると予想されましたが、応答がすべての呼び出しが完了した後にのみ発生するため、そうではないようです。WebClient DownloadDataAsync(または代替)からマルチスレッド応答を取得する方法は?

これは妥当な修正とは何ですか?別のクライアントタイプがありますか、または各Webクライアント呼び出しごとにスレッドを作成すべきですか?

ので、現在私は、ループ内でこれを呼んでいる:

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

コードを投稿することはできますか? – Strillo

+0

@Strillo、完了、それはすべてのことが関係していると仮定します。 – bretddog

答えて

1

機能、ないバグ。可能であれば、WebClientは同じスレッドでDownloadCompletedイベントを発生させようとします。 WinformsまたはWPFアプリケーションのUIスレッドから呼び出すことができます。これは通常は望ましいですが、Control/Dispatcher.BeginInvoke()を使用することなく、完了イベントハンドラのUIを更新できます。しかし、サイド・エフェクトを使用すると、コードが実行を停止してイベント・ハンドラをコールできるようになるまで、これは発生しません。 UIスレッドのディスパッチループによってディスパッチされます。

本当に必要な場合は、ThreadPool.QueueUserWorkItem()またはスレッドで始まる小さなヘルパーメソッドを使用してダウンロードを開始してください。

+0

ありがとう! ThreadPoolを使用しています。私が聞いてもらえない場合は、5-10000通話から数百MBの写真をダウンロードしてください。このメモリはどこにあるのでしょうか? (UIのフリーズは考慮しない) – bretddog

関連する問題