2012-12-16 42 views

回答

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事件内更新标签(因为它也被调用并在后台线程中运行) )。

因此,我们所做的是使用Form.Invoke方法,它确保我们想要执行的任何操作都是在窗体自己的线程中执行。我们将Action委托传递给包含我们要执行的代码的Invoke方法。而且该代码只是更新标签。


至少我找不到文档中的任何说法,否则 - 事件可能实际上在前台线程,但在这种情况下,上面的代码仍然有效执行。

+0

是的,我知道这一点。但我使用控制台应用程序,我不知道如何使用它。 – davidwroxy

+0

@ user1690292在控制台应用程序中它更容易,只需将百分比输出到控制台而不是标签。然后你也不需要通过'Invoke'进行绕行。 –

+0

你能否为此写一个简短的例子,因为我不知道该怎么做。 – davidwroxy