Visual Basic控制台应用程序下载百分比?

时间:2012-12-16 15:41:56

标签: vb.net download webclient

我正在使用DownloadFileAsync下载更大的文件(1.3 GB),但我想添加一个简单的百分比指标(例如64%)。我是Visual Basic的新手我不知道如何做到这一点。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分: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正在后台线程中运行异步文件下载。但是,表单控件只能从运行表单的前台线程更新。因此,我们无法直接在ProgressUpdate事件内更新标签(因为它也被调用并运行,在后台线程 1 )。

所以我们做的是使用Form.Invoke方法,它保证我们想要执行的任何东西都是在表单自己的线程中执行。我们将Action委托传递给Invoke方法,该方法包含我们要执行的代码。而且该代码只是更新标签。


1 至少我在文档中找不到任何其他内容 - 事件可能实际在前台线程中执行但在这种情况下上面的代码仍然有效