2012-12-16 78 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