Эпизодически появляется ошибка System.IO.IOException

427
14 января 2017, 10:58

System.IO.IOException was unhandled Message: An unhandled exception of type 'System.IO.IOException' occurred in PresentationCore.dll Additional information: Не удается прочитать данные из потока.

Ошибка появляется нерегулярно, эпизодически. Алгоритм следующий:

  1. собираю ссылки на картинки в интернете, с этим все ОК
  2. для отображения использую 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 начинает "подгружать" по нужной ссылке. Как можно это побороть?

Answer 1

Проблема решилась некоторым переписыванием в асинхронном стиле, плюс отказ от прямой загрузки картинки по адресу с помощью самого 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;
    }
READ ALSO
Insert into schema.table PostgreSQL c#

Insert into schema.table PostgreSQL c#

Как добавить запись в бд с указанием нужной схемы? Проблема с запросомЕсли не указывать имя схемы, то записывает в public, если указываю тогда...

396
С# DataGridView + BindingSource+DataSet

С# DataGridView + BindingSource+DataSet

Результат запроса загоняется в DataSetК DataSet привязан BindingSource

399
Объект удалит сам себя

Объект удалит сам себя

У меня есть следующая структура:

378
Масштабирование TabControl`ов C# wpf

Масштабирование TabControl`ов C# wpf

Есть tabcontrol с tabitemsРеализовал масштабирование внутри tabcontrol но не знаю как масштабировать сами кнопки tabcontrol то есть TabItem`ы

555