#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(...)... }
Комментариев нет:
Отправить комментарий