1

DownloadFileAsync を使用してより大きなファイル (1.3 GB) をダウンロードしていますが、単純なパーセンテージ インジケーター (例: 64%) を追加したいと考えています。Visual Basic を初めて使用するので、これを行う方法がわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

1

WebClientクラスには、DownloadProgressChanged進行状況の表示を更新する場合にリッスンできるイベントがあります。たとえば、コンソール アプリケーションがある場合は、次のように簡単です。

Dim client As New WebClient()
AddHandler client.DownloadProgressChanged, AddressOf ProgressUpdate
client.DownloadFileAsync(yourURI, yourFile)
Sub ProgressUpdate(sender As Object, e As DownloadProgressChangedEventArgs)
    ' Reset cursor position …
    Console.CursorTop -= 1
    Console.CursorLeft = 0
    Console.WriteLine("{0}% completed", e.ProgressPercentage)
End Sub

一方、 WinForms プロジェクトにいて、更新したいFormラベルがある場合は、次のコードでそれを行います。ProgressLabel

Sub ProgressUpdate(sender As Object, e As DownloadProgressChangedEventArgs)
    Dim s = String.Format("{0}% completed", e.ProgressPercentage)
    Me.Invoke(New Action(Sub()
                             ProgressLabel.Text = s
                         End Sub))
End Sub

マルチスレッドのため、このProgressUpdate方法は少し複雑です。

WebClient、バックグラウンド スレッドで非同期ファイル ダウンロードを実行しています。ただし、フォーム コントロールは、フォームが実行されているフォアグラウンド スレッドからのみ更新できます。そのため、イベント内でラベルを直接更新することはできません(これもバックグラウンド スレッド1ProgressUpdateで呼び出され、実行されているため)。)。

したがって、代わりにForm.Invoke、実行したいものはすべてフォーム自体のスレッドで実行されることを保証するメソッドを使用します。実行したいコードを含むメソッドにActionデリゲートを渡します。Invokeそして、そのコードはラベルを更新しているだけです。


1少なくともドキュメントにはそうではないという記述は見つかりませんでした。イベントは実際にはフォアグラウンド スレッドで実行される可能性がありますが、その場合でも上記のコードは機能します。

于 2012-12-16T15:48:15.793 に答える