我正在从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);
Run Code Online (Sandbox Code Playgroud)
这是FTPClient(我将覆盖GetWebRequest()):
class FTPClient : WebClient
{
protected override WebRequest GetWebRequest(System.Uri address)
{
FtpWebRequest req = (FtpWebRequest) base.GetWebRequest(address);
req.UsePassive = false;
return req;
}
}
Run Code Online (Sandbox Code Playgroud)
如果它有帮助我的回调:
void UpdateProgress(object sender, DownloadProgressChangedEventArgs e)
{
dwnProgress.Value = e.ProgressPercentage;
dwnprcnt.Text = PercentProgress.ToString() + "%";
}
Run Code Online (Sandbox Code Playgroud)
UsePassive用于在建立文件传输连接时“确定”谁充当服务器,因此它不应该与传输的实际状态有任何关系。请问您在哪里读过这篇文章?
难道是这样
您可以在 UpdateProgress 中设置断点并查看 e 的任何属性中的任何内容吗?
作为旁注,由于您正在异步下载文件,因此使用另一个线程进行实际下载。在您的事件方法中,您可能想要执行以下操作:
void UpdateProgress(object sender, DownloadProgressChangedEventArgs e) {
setProgress(e.ProgressPercentage);
setText(e.ProgressPercentage.ToString() + "%");
}
private void setProgress(int progress){
if (dwnProgress.InvokeRequired) {
dwnProgress.Invoke(new Action<int>(setProgress), progress);
return;
}
dwnProgress.Value = progress;
}
private void setText(string text) {
if (dwnprcnt.InvokeRequired) {
dwnprcnt.Invoke(new Action<string>(setText), text);
return;
}
dwnprcnt.Text = text;
}
Run Code Online (Sandbox Code Playgroud)
这会将 setmethods 排队到 UI 线程。