Я загружаю файл с (Асинхронного) FTP-сайта и потребность обновить индикатор выполнения. Я прочитал документацию MS, которая указывает, что это может быть сделано, класс WebClient, GetWebRequest () является ovverriden, таким образом, свойство 'UsePassive' установлено на 'ложь'. Я сделал это, но аргумент события '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() + "%";
}
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;
}
Что вместо этого поставит setmethods в очередь на поток UI.