2015-02-11 126 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