我正在从FTP站点(Async)下载文件,需要更新进度条 . 我已经阅读了MS文档,声明可以做到这一点是WebClient类的GetWebRequest()是ovverriden所以'UsePassive'属性被设置为'false' . 我已经这样做但是'DownloadProgressChanged'事件参数ProgressPercentage总是=='0' .
有人能告诉我如何让这个论点开始返回值吗?
这是下载方法:
FTPClient request = new FTPClient();
request.Credentials = new NetworkCredential(user, password);
request.DownloadProgressChanged += UpdateProgress;
request.DownloadFileAsync(ftpepath,destinationpath);
这是FTPClient(我将覆盖GetWebRequest()):
class FTPClient : WebClient
{
protected override WebRequest GetWebRequest(System.Uri address)
{
FtpWebRequest req = (FtpWebRequest) base.GetWebRequest(address);
req.UsePassive = false;
return req;
}
}
如果它有帮助我的回调:
void UpdateProgress(object sender, DownloadProgressChangedEventArgs e)
{
dwnProgress.Value = e.ProgressPercentage;
dwnprcnt.Text = PercentProgress.ToString() + "%";
}
2 回答
UsePassive
用于"determine",当进行文件传输的连接时,它充当服务器,因此它不应与传输的实际状态有任何关系 . 请问你在哪里看过这个?可能是那样的
对于大文件,更改非常小,所以您没有看到百分比变化?
该文件小于ftpwebrequests内部缓冲区,所以你在任何"update"之前得到整个文件?
你能在UpdateProgress中设置断点并查看任何e属性中的任何内容吗?
作为旁注,由于您正在下载文件异步,因此另一个线程用于实际下载 . 在您的事件方法中,您可能希望执行以下操作:
这会将setmethods排队到UI线程 .
我想对上面的帖子发表评论,但我太新了:(
在覆盖Web请求方法时引用MSDN:
http://msdn.microsoft.com/en-US/library/system.net.webclient.downloadprogresschanged(v=vs.80).aspx
但是,如果您的FTP服务器未设置为接受活动连接,那么在回答OP问题时,设置WebClient.UsePassive = false将没有任何区别 .
编辑:我在我的项目上启用了System.Net.Tracing并尝试了被动模式和主动模式,不仅两者都按预期工作... TotalBytes仍然是-1所以我的想法是MSDN上的注释错误或者我们遗漏了某些东西
DownloadFileProgressChangedEventArgs确实包含收到的总字节数,如果您知道文件大小,则可以自己计算 .
可能有更好的方法...但我使用快速FtpWebRequest来获取文件大小,然后将其传递给DownloadProgressCallback方法以更新进度条 .
上面的海报没有提到的是你的更新进度方法必须调用控件,因为它是由DownloadFileAsync创建的线程调用的,你只能从创建它的线程中更改控件 .
您应该使用调度程序进行控制,例如
见http://msdn.microsoft.com/en-us/library/ms591206.aspx