Страницы

Поиск по вопросам

среда, 22 мая 2019 г.

Асинхронная загрузка изображений без остановки ui wpf

Есть стэк, который биндится к списку изображений.

Как мне асинхронно подгружать в него изображения (Большой объем), чтобы ui не останавливался? Пробовал в коллекцию через асинхронный метод добавлять, но поток все равно останавливается. Во view добавлял объекту IsAsync, тоже не помогает.
private async void GenerateTop() { Screenshots = new ObservableCollection(); await Task.Run(() => { LastAdded.Add(...)... } }


Ответ

Вы должны разделить модель и представление.
Функции загрузки модели должны бежать в неосновном потоке, и там пусть загружают что угодно как угодно медленно. Представление (в случае, если вы используете MVVM, это ваша VM) получает от модели любым способом извещение о том, что данные загрузка произошла и есть новые данные для показа, и (в главном потоке!) обновляет VM-список изображений.
Таким образом ваш UI не будет подвисать, ваш код будет будет асинхронным, а волосы — мягкими и шелковистыми.

Если подвисает загрузка картинки, попробуйте и правда использовать IsAsync в привязке. Единственная тонкость — у вас сейчас IsAsync грузит асинхронно строку, а конверсия в картинку выполняется в UI-потоке. Попробуйте указать конвертер:
class ImageSourceLoadingConverter : IValueConverter { public object Convert(object value, Type targetType, object p, CultureInfo ci) => new BitmapImage(new Uri((string)value));
public object ConvertBack(object value, Type targetType, object p, CultureInfo ci) => throw new NotSupportedException(); }
в этом случае, кажется, конверсия будет производиться асинхронно.

Комментариев нет:

Отправить комментарий