System.IO.IOException was unhandled Message: An unhandled exception of type 'System.IO.IOException' occurred in PresentationCore.dll Additional information: Не удается прочитать данные из потока.
Ошибка появляется нерегулярно, эпизодически. Алгоритм следующий:
ListBox
, который связан с коллекцией ObservableCollection<BitmapImage>
Вот метод, наполняющий коллекцию
/// <summary>
/// Заполнение списка картинок
/// </summary>
/// <param name="addresses"></param>
private void LoadListImages(List<string> addresses)
{
//будущая коллекция картинок
ListImages = new ObservableCollection<BitmapImage>();
//to UI
MessageUser.MessageJob.Report("Загружаем картинки...");
try
{
int i = 1;
BitmapImage bImage = null;
foreach (var address in addresses)
{
//to UI
MessageUser.MessageJob.Report($"Загружаем {i}...");
//новая картинка
bImage = new BitmapImage(new Uri(address, UriKind.RelativeOrAbsolute));
//размеры
bImage.DecodePixelHeight = 100;
bImage.DecodePixelWidth = 100;
//картинку в коллекцию
ListImages.Add(bImage);
//счетчик
i++;
}
}
catch (Exception ex)
{
Debug.WriteLine($"{nameof(LoadListImages)} - {ex.Message}");
throw;
}
}
Метод отрабатывает на ура. Я даже по шагам его проходил, и даже в ситуациях, когда возникает эта ошибка, но ошибка возникает сразу после выхода из метода, т.е., как я понимаю, в момент когда уже UI должен начать отображать картинки и BitmapImage
начинает "подгружать" по нужной ссылке. Как можно это побороть?
Проблема решилась некоторым переписыванием в асинхронном стиле, плюс отказ от прямой загрузки картинки по адресу с помощью самого BitmapImage
, а задействование для этого HttpClient
. Ну и в целом картинки стали появляться (загружаться) постепенно одна за одной, а не скопом сразу как это было раньше.
/// <summary>
/// Заполнение списка картинок
/// </summary>
/// <param name="addresses"></param>
private async Task LoadListImagesAsync(List<string> addresses)
{
//будущая коллекция картинок
ListImages = new ObservableCollection<BitmapImage>();
//to UI
MessageUser.MessageJob.Report("Загружаем картинки...");
//общее количество загружаемых картинок
string count = addresses.Count.ToString();
try
{
int i = 1;
BitmapImage bImage = null;
foreach (var address in addresses)
{
//to UI
MessageUser.MessageJob.Report($"Загружаем: {i} из {count}...");
//новая картинка
Uri pathPicture = new Uri(address, UriKind.RelativeOrAbsolute);
bImage = await LoadBitmapImageAsync(pathPicture);
//картинку в коллекцию
ListImages.Add(bImage);
//счетчик
i++;
}
}
catch (Exception ex)
{
Debug.WriteLine($"{nameof(LoadListImagesAsync)} - {ex.Message}");
throw;
}
}
/// <summary>
/// Загрузка картинки из адреса
/// </summary>
/// <param name="pathPicture">адрес картинки</param>
/// <returns></returns>
private async Task<BitmapImage> LoadBitmapImageAsync(Uri pathPicture)
{
BitmapImage result = new BitmapImage();
//размеры
result.DecodePixelHeight = 100;
result.DecodePixelWidth = 100;
try
{
using (HttpClient client = new HttpClient())
using (var response = await client.GetAsync(pathPicture))
{
response.EnsureSuccessStatusCode();
result.BeginInit();
result.CacheOption = BitmapCacheOption.OnLoad;
result.StreamSource = await response.Content.ReadAsStreamAsync();
result.EndInit();
}
}
catch (Exception ex)
{
Debug.WriteLine($"{nameof(LoadBitmapImageAsync)} - {ex.Message}");
return new BitmapImage();
}
return result;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как добавить запись в бд с указанием нужной схемы? Проблема с запросомЕсли не указывать имя схемы, то записывает в public, если указываю тогда...
Результат запроса загоняется в DataSetК DataSet привязан BindingSource
Есть tabcontrol с tabitemsРеализовал масштабирование внутри tabcontrol но не знаю как масштабировать сами кнопки tabcontrol то есть TabItem`ы