我正在使用 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
另一方面,如果您Form
在 WinForms 项目中,并且您有一个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至少我在文档中找不到任何其他说明——事件实际上可能在前台线程中执行,但在这种情况下,上面的代码仍然有效。