Всем привет. Пытаюсь Использую 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;
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Работаю в visual foxproНе работает объединения таблиц, ни через знак равенства ни через join
Пользователь задает $points - это число точекУ меня есть цикл, в нем есть inputы