Страницы

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

суббота, 7 марта 2020 г.

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

#c_sharp #wpf #многопоточность #binding #async


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


    
        
            
                
            
        
        
            
                
                    
                
            
        
    



Как мне асинхронно подгружать в него изображения (Большой объем), чтобы ui не останавливался?
Пробовал в коллекцию через асинхронный метод добавлять, но поток все равно останавливается.
Во view добавлял объекту IsAsync, тоже не помогает.

private async void GenerateTop()
{
    Screenshots = new ObservableCollection();
    await Task.Run(() =>
    {
        LastAdded.Add(...)...
    }
}

    


Ответы

Ответ 1



Вы должны разделить модель и представление. Функции загрузки модели должны бежать в неосновном потоке, и там пусть загружают что угодно как угодно медленно. Представление (в случае, если вы используете 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(); } в этом случае, кажется, конверсия будет производиться асинхронно.

Ответ 2



Сделайте обычный метод(не асинхронный). Заполните в нем всю коллекцию и попробуйте так: далее: private void GenerateTop() { Screenshots = new ObservableCollection(); LastAdded.Add(...)... }

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

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