Веб-клиент возвращает прогресс загрузки как 0 - PullRequest
0 голосов
/ 21 ноября 2018

Я написал вспомогательный класс для загрузки файла с сервера с помощью класса webclient.Код работал хорошо до недавнего времени.Внезапно код не работает, прогресс загрузки всегда равен 0, а количество полученных байтов всегда равно -1.Загрузка работает нормально, но проблема только в фактическом изменении прогресса.Процесс загрузки остается нулевым от начала до конца процесса загрузки, даже общее количество байтов, которые нужно получить, остается равным -1.

Пожалуйста, найдите образец кода, указанный ниже.

public class FileDownloader
    {
        private string _zipFilePath;
        private string _destinationPath;
        private int _productId;
        public Action<int,int> progressListener;
        private WebClient _client;
        public void Download(string cloudPath, string localPath,int id)
        {
            _productId = id;
            _zipFilePath = localPath +id+ ".zip";
            _destinationPath = localPath + id;
            if (!Directory.Exists(localPath))
            {
                Directory.CreateDirectory(localPath);
            }
            _client = new WebClient();
            if (cloudPath != "")
            {
                Uri uri = new Uri(cloudPath);
                _client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCallback);
                _client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback);
                _client.DownloadFileAsync(uri, _zipFilePath);   
            }else
            {
                progressListener?.Invoke(_productId, -1);
            }
        }

        public void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e)
        {
            if(e.ProgressPercentage != 100)
                progressListener?.Invoke(_productId, e.ProgressPercentage);
        }

        public void CancelDownload()
        {
            _client.CancelAsync();
        }

        public void DownloadFileCallback(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Cancelled == false && e.Error == null)
            {
                //UnzipContent(_destinationPath,_zipFilePath);
                UnzipHandler unzipHandler = new UnzipHandler(_destinationPath, _zipFilePath,new UnzipCompletionCallback(UnzippedCourse));
                Thread thread = new Thread(new ThreadStart(unzipHandler.UnzipContent));
                thread.Start();
            }
            else
            {
                DeleteZip(_zipFilePath);
                progressListener?.Invoke(_productId, -1);
            }
        }

        private void DeleteZip(string zipPath)
        {
            if (File.Exists(zipPath))
            {
                File.Delete(zipPath);
            }
        }

        public void UnzippedCourse(bool status)
        {
            DeleteZip(_zipFilePath);
            if(status)
                progressListener?.Invoke(_productId, 100);
            else
                progressListener?.Invoke(_productId, -1);
        }

        public delegate void UnzipCompletionCallback(bool result);
    } 
...