Я хотел оставить комментарий к вышеуказанному посту, но я слишком новый: (* 1001 *
Ссылка на MSDN при переопределении метода веб-запроса:
http://msdn.microsoft.com/en-US/library/system.net.webclient.downloadprogresschanged(v=vs.80).aspx
Однако в ответ на вопрос OPs, если ваш FTP-сервер не настроен на прием активных подключений, тогда установка WebClient.UsePassive = false не будет иметь значения.
РЕДАКТИРОВАТЬ: я включил System.Net.Tracing в моем проекте и пробовал как пассивный, так и активный режимы, и они не только работают как положено ... TotalBytes по-прежнему равен -1, поэтому я думаю, что ошибка в MSDN ошибочна чего-то не хватает
DownloadFileProgressChangedEventArgs содержит общее количество полученных байтов, и если вы знаете размер файла, вы можете рассчитать его самостоятельно.
Вероятно, есть лучший способ ... Но я использовал быстрый запрос FtpWebRequest, чтобы получить размер файла, а затем передал его в метод DownloadProgressCallback для обновления индикатора выполнения.
Кроме того, вышеупомянутый плакат не упоминается о том, что ваш метод прогресса обновления должен вызывать элемент управления, поскольку он вызывается потоком, созданным DownloadFileAsync, и вы можете изменить элемент управления только из потока, который его создал.
Вы должны использовать диспетчер для контроля, например,
if (!myCheckBox.Dispatcher.CheckAccess())
{
myCheckBox.Dispatcher.BeginInvoke(new Action(
delegate()
{
myCheckBox.IsChecked = true;
}
));
}
else
{
myCheckBox.IsChecked = true;
}
См. http://msdn.microsoft.com/en-us/library/ms591206.aspx