Начал разбираться с async/await, понял принцип работы, но столкнулся со такой проблемой:
///
public LoadingFile(string fileName, int timeLoad) { FileName = fileName; TimeLoad = timeLoad; } }
В классе ViewModel два списка: Список файлов которые нужно загрузить и список уже загруженных файлов.
#region Constructors
public MainWindowViewModel() { //файлы для загрузки. с разным временем скачивания LoadingFiles = new List
};
//Загруженные файлы. LoadedFiles = new ObservableCollection
Команда WPF которая запускает процесс скачки
///
foreach (var task in tasks) //хоть задачи и выполняются асинхронно но результатов дожидаемся синхронно. { var result = await task; LoadedFiles.Add(result); }
MessageBox.Show("Загрузка завершена"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }));
} }
асинхронная задача по скачиванию.
private async Task
ИТОГО: хочу добиться параллельного скачивания, т.е. чтобы в список скаченных файлов попадали сначала файлы с малым временем скачивания а не по порядку 1,2,3,4... В моей реализации var result = await task; заставляет обязательно дождаться скачивания первого файла, хотя многие другие файлы с меньшем временем скачивания уже скачаны и помешаются в список мгновенно, после скачки первого. Но мне нужен правильный порядок: т.е. все таски параллельно дожидаются await и когда дождались помешают результат в список.
Ответ
Попробуйте такое:
В UI-коде:
async Task DownloadFileAndShow(LoadingFile f)
{
var res = await LoadFileAsync(file);
LoadedFiles.Add(res);
}
И запускайте все эти задачи:
var tasks = LoadingFiles.Select(file => DownloadFileAndShow(file));
await Task.WhenAll(tasks);
Ну или просто упакуйте всё в асинхронную лямбду:
await Task.WhenAll(
LoadingFiles.Select(
async file => LoadedFiles.Add(await LoadFileAsync(file))));
(это если я правильно понял: вам нужны результаты в порядке загрузки, правильно?)
Комментариев нет:
Отправить комментарий