2015-02-11 106 views
2

在Visual Studio中使用C#編寫一些編程,我試圖下載文件並將進度鏈接到ProgressBar。當我在Visual Basic中完成時它工作得很好,但當我嘗試在C#中完成時,Client.DownloadProgressChanged事件不會觸發。WebClient.DownloadProgressChanged不會觸發

System.Net.WebClient Client = new System.Net.WebClient(); 
Client.DownloadProgressChanged += Client_DownloadProgressChanged; 
Client.DownloadFileAsync(new Uri(url), filepath + filename); 
while (Client.IsBusy) { } 

Client_DownloadProgressChanged的唯一事情是一些代碼,改變TextBox爲「Test1的」我做到了只是爲了看看它運行的價值。

+2

此代碼在什麼情況下運行?如果它在UI線程上,'while(Client.IsBusy)'將被阻塞。 – wgraham 2015-02-11 20:29:17

+0

我不知道如何做與線程有關的任何事情,所以在我的代碼中沒有提及它。無論默認情況下是使用什麼線程。 – Aurionin 2015-02-11 20:32:12

+0

@wgraham DownloadFileAsync將在線程池中的線程上運行,而不是在UI線程上運行,所以沒關係。 DownloadFileAsync還打印[網絡跟蹤信息](https://msdn.microsoft.com/en-us/library/hyb3xww8(v = vs.110).aspx)信息,以便您可以查看以查看發生了什麼背景。 – JNYRanger 2015-02-11 21:26:37

回答

3

此:

while (Client.IsBusy) { } 

擠佔UI消息循環。它保持消耗,並且不允許處理任何其他消息。與此同時,事件正在阻塞的UI線程上排隊。

如果您對該行發表評論並且下載完成,您將看到正確的文本框更新。

你應該重新考慮你想要做什麼。如果Client,請考慮將while循環移至background thread