【发布时间】:2012-12-03 21:11:41
【问题描述】:
我正在使用 DownloadFileAsync 下载一个更大的文件(1.3 GB),但我想添加一个简单的百分比指标(例如 64%)。我是 Visual Basic 新手,我不知道该怎么做。
任何帮助将不胜感激。
【问题讨论】:
我正在使用 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 正在后台线程中运行异步文件下载。但是,表单控件只能从运行表单的前台线程更新。因此,我们不能直接在ProgressUpdate 事件中更新标签(因为它也在被调用并运行在后台线程1)。
所以我们改为使用Form.Invoke 方法,它保证我们想要执行的任何内容都在表单自己的线程中执行。我们将Action 委托传递给包含我们要执行的代码的Invoke 方法。而该代码只是在更新标签。
1 至少我在文档中找不到任何其他说明 - 事件 可能 实际上在前台线程中执行,但在这种情况下,上面的代码仍然有效.
【讨论】:
Invoke绕道而行。
Console.ReadLine,则百分比显示为两行。