我正在使用DownloadFileAsync下载较大的文件(1.3 GB),但我想添加一个简单的百分比指标(例如64%)。我是新来的Visual Basic我不知道如何做到这一点。Visual Basic控制台应用程序下载百分比?
任何帮助,将不胜感激。
我正在使用DownloadFileAsync下载较大的文件(1.3 GB),但我想添加一个简单的百分比指标(例如64%)。我是新来的Visual Basic我不知道如何做到这一点。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
事件内更新标签(因为它也被调用并在后台线程中运行) )。
因此,我们所做的是使用Form.Invoke
方法,它确保我们想要执行的任何操作都是在窗体自己的线程中执行。我们将Action
委托传递给包含我们要执行的代码的Invoke
方法。而且该代码只是更新标签。
至少我找不到文档中的任何说法,否则 - 事件可能实际上在前台线程,但在这种情况下,上面的代码仍然有效执行。
是的,我知道这一点。但我使用控制台应用程序,我不知道如何使用它。 – davidwroxy
@ user1690292在控制台应用程序中它更容易,只需将百分比输出到控制台而不是标签。然后你也不需要通过'Invoke'进行绕行。 –
你能否为此写一个简短的例子,因为我不知道该怎么做。 – davidwroxy