Загрузка файлов в потоке в WPF

162
18 июля 2021, 15:30

Всем привет. Пытаюсь Использую WPF на чистом MVVM и FluentFTP для создания простого клиента, который скачивает файлы с удаленного сервера. При попытке скачивания небольших файлов в новом потоке все проходит идеально. Прогресс бар обновляется, Progress обновляет значение прогресса.

Вот только при попытке скачать параллельно файл большого и маленького размера все идет на перекосяк. Большой файл полностью загружается, а небольшой файл загружается частично. Как правильнее реализовать данную идею?

Команда для скачивания файла

public class DownloadCommand : BaseCommand<FileViewModel>
{
    ...
    public override void Execute(object parameter)
    {
        var file = (File)parameter;
        var path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        var thread = new Thread(() => { Download(file, path); });
        thread.Start();
    }
    private async void Download(File file, string path)
    {
        var client = FileViewModel.Client;
        var downloadFile = new DownloadFile(file);
        FileViewModel.DownloadFiles.Add(downloadFile);
        await client.DownloadFileAsync(path, file.LocalPath, FtpLocalExists.Overwrite, FtpVerify.None, downloadFile.Progress);
    }
}

Класс DownloadFile

...
public class DownloadFile : INotifyPropertyChanged
{
    private double currentProgress;
    private bool isIndeterminate;
    public Progress<FtpProgress> Progress;
     public DownloadFile(File file)
     {
        File = file;
        Progress = new Progress<FtpProgress>(x => {
            if (x.Progress < 0 || double.IsNaN(x.Progress) || double.IsInfinity(x.Progress))
            {
                IsIndeterminate = true;
            }
            else
            {
                IsIndeterminate = false;
                CurrentProgress = x.Progress;
            }
        });
     }
}

P.S - С добавлением нового клиента все работает. У самой модели DownloadFile можно убрать Progress и оставить только значения. Простой рабочий код скачивания множества файлов асинхронно через FluentFTP:

        private async void Download(DownloadFile file, string path)
        {
            path = Path.Combine(path, file.Name);
            var client = new FtpClient(FileViewModel.Client);
            var remotePath = file.LocalPath;
            var progress = new Progress<FtpProgress>(x =>
            {
                if (Application.Current.Dispatcher == null) return;
                if (x.Progress < 0)
                {
                    Application.Current.Dispatcher.Invoke(() => { file.IsIndeterminate = true; });
                }
                else
                {
                    Application.Current.Dispatcher.Invoke(() =>
                    {
                        file.IsIndeterminate = false;
                        file.CurrentProgress = x.Progress;
                    });
                }
            });
            var isDownload = await client.DownloadFileAsync(path, remotePath, progress: progress);
            while (isDownload)
            {
                client.Dispose();
                break;
            }
        }
READ ALSO
Как использовать JOIN SQL

Как использовать JOIN SQL

Работаю в visual foxproНе работает объединения таблиц, ни через знак равенства ни через join

183
Ошибка при установке пакета composer

Ошибка при установке пакета composer

из-за чего такая проблема при установке пакета?

207
нумерация значений input&#39;ов в цикле

нумерация значений input'ов в цикле

Пользователь задает $points - это число точекУ меня есть цикл, в нем есть inputы

247
Объединить два условия на php

Объединить два условия на php

Есть 2 условия на phpНужно их объединить

274