Я разрабатываю приложение для UWP.Почему OpenReadAsync внутри цикла foreach висит в потоке пользовательского интерфейса?
Мне нужно загрузить папку, содержащую около 700 небольших изображений. Это метод, который я использую для загрузки фотографий в память:
private async Task<ObservableCollection<ImageSource>> LoadPicturesAsync()
{
var pictureList = new ObservableCollection<ImageSource> { };
pictureFiles.ForEach(async file =>
{
var img = new BitmapImage();
pictureList.Add(img);
var stream = await file.OpenReadAsync();
await img.SetSourceAsync(stream);
});
return pictureList;
}
Когда этот метод вызывается с помощью конструктора моей точки зрения модели, вид, кажется, быть заблокирован (не реагирует) в течение около 6 секунд.
Это странно, потому что все операции ввода-вывода выполняются асинхронно, и единственное, что работает в потоке пользовательского интерфейса, - это создание объектов BitmapImage в цикле foreach. Это так быстро, что он не должен блокировать поток пользовательского интерфейса.
Мой вопрос: почему блок потока пользовательского интерфейса в течение 6 секунд знал, что я выполняю все операции ввода-вывода асинхронно? И как исправить это, так что поток пользовательского интерфейса не заблокирован?
Это, как я называю этот метод:
private async Task Init()
{
PictureList = await LoadPicturesAsync();
}
//constructor
public MainVewModel(){
Init();
}
Как и где вы называете Init()? Где называется ваша конструкция модели? Вы пытались создать только новую коллекцию в конструкторе: 'PictureList = new ObservableCollection();' и затем заполнить сбор асинхронно вне конструктора? ('... await img.SetSourceAsync (поток); PictureList.Add (img);' - измененный порядок) –
Romasz
Какой тип 'pictureFiles' и откуда он? –
@Romasz см. Мой обновленный вопрос. – disklosr