2012-06-13 132 views
4

我向WebClient的DownloadProgressChanged事件添加了一个事件处理程序,但它似乎从未触发。该文件已成功下载,但未更新其进度。WebClient.DownloadProgressChanged永远不会被调用

public class DownloadFile 
{ 
    private File file = null; 

    public DownloadFile(File file) 
    { 
     this.file = file; 
    } 

    public void startDownloadThread() 
    { 
     Console.WriteLine("Starting Download : "+file.URL); 

     var t = new Thread(() => DownloadThread(file)); 
     t.Start(); 
    } 

    public Action<string> action_error_downloadFailed = Console.WriteLine; 
    private void DownloadThread(File file) //Unnecessary argument but whatever ;D 
    { 
     try 
     { 
      string url = file.URL; 
      string savepath = file.DestinationDir + "\\" + file.Filename; 

      WebClient_B client = new WebClient_B(); 
      client.Proxy = null; //default to no proxy 
      client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 
      client.DownloadFile(url, savepath); 

      Console.WriteLine("Download finished :" + file.Filename); 
     } 
     catch (Exception ex) 
     { 
      if (action_error_downloadFailed != null) 
       action_error_downloadFailed("Download failed :"+ex.Message); 
     } 
    } 

    private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
    { 
     try 
     { 
      if (file.TotalSize == 0) 
       file.TotalSize = (int)e.TotalBytesToReceive; 
      file.CurrentSize = (int)e.BytesReceived; 

      Form_DownloadManager.rebuildQueue(); 

      Console.WriteLine("{0} downloaded {1} of {2} bytes. {3} % complete...", 
      (string)e.UserState, 
      e.BytesReceived, 
      e.TotalBytesToReceive, 
      e.ProgressPercentage); 
     } 
     catch (Exception ex) { Console.WriteLine("client_DownloadProgressChanged error : "+ex.Message); } 
    } 
} 

输出:

Starting Download : http://x.x.x/y/z.zip 
'projectname.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
The thread '<No Name>' (0x3b8c) has exited with code 0 (0x0). 
Download finished :z.zip 

我使用WebClient_B,因为我不得不用户代理+的CookieContainer功能添加到WebClient类,因为我的服务器一直拒绝下载请求。不过,这个事件从来没有用'标准'WebClient类别开除。所以这不应该是问题。但不管怎么说; link to class

回答

8
client.DownloadFile(url, savepath); 

您必须使用异步版本下载文件,目前使用阻塞,同步版本。

msdn docsWebClient.DownloadProgressChanged

异步下载操作成功转移 部分或全部数据的发生。

在你的情况,这将是:

client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 
client.DownloadFileAsync (url, savepath); 

因为你的方法不直接返回任何结果,这个重构不应该是一个问题,不过要注意的是,下载最有可能尚未完成到方法返回给调用者的时候。

+1

详细'DownloadProgressChanged'和'DownloadFileCompleted'处理程序都执行其称为线程'DownloadDataAsync'(根据我的测试)。 –

5

如果你想使用同步Web客户端,同时获得最新进展,你可以靠这个方法在这里

http://alexfeinberg.wordpress.com/2014/09/14/how-to-use-net-webclient-synchronously-and-still-receive-progress-updates/

public void DownloadFile(Uri uri, string desintaion) 
{ 
    using(var wc = new WebClient()) 
    { 
    wc.DownloadProgressChanged += HandleDownloadProgress; 
    wc.DownloadFileCOmpleted += HandleDownloadComplete; 

    var syncObj = new Object(); 
    lock(syncObject) 
    { 
     wc.DownloadFileAsync(sourceUri, destination, syncObject); 
     //This would block the thread until download completes 
     Monitor.Wait(syncObject); 
    } 
    } 

    //Do more stuff after download was complete 
} 

public void HandleDownloadComplete(object sender, AsyncCompletedEventArgs args) 
{ 
    lock(e.UserState) 
    { 
     //releases blocked thread 
     Monitor.Pulse(e.UserState); 
    } 
} 


public void HandleDownloadProgress(object sender, DownloadProgressChangedEventArgs args) 
{ 
    //Process progress updates here 
} 
+0

您是否认为syncObj是锁的参数? –

相关问题