DownloadFileAsync を使用してより大きなファイル (1.3 GB) をダウンロードしていますが、単純なパーセンテージ インジケーター (例: 64%) を追加したいと考えています。Visual Basic を初めて使用するので、これを行う方法がわかりません。
どんな助けでも大歓迎です。
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少なくともドキュメントにはそうではないという記述は見つかりませんでした。イベントは実際にはフォアグラウンド スレッドで実行される可能性がありますが、その場合でも上記のコードは機能します。