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

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

于 2012-12-16T15:48:15.793 回答