Как показать, что загрузка прогрессирует от FTP

Я загружаю файл с (Асинхронного) 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() + "%";
        }
5
задан Nick 24 February 2010 в 18:15
поделиться

1 ответ

UsePassive используется для "определения" того, кто выступает в качестве сервера, когда устанавливается соединение для передачи файла, поэтому он не должен иметь никакого отношения к фактическому состоянию передачи. Могу ли я спросить, где вы это прочитали?

Может ли быть так, что

  • изменение очень мало для большого файла, поэтому вы не видите процент изменения?
  • что файл меньше, чем внутренний буфер ftpwebrequests, поэтому вы получаете весь файл до любого "обновления"?

Можете ли вы установить точку останова в 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.

3
ответ дан 14 December 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: