.NET 4.x Многопоточная загрузка картинки с интернета и ее отображение - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Прошу помощи. Попытался тут разобраться с TPL библиотекой, но возникает проблема с одной деталью... Суть тестового приложения: создаю форму, после формы запускаю второй поток, который скачивает картинку, а по завершении скачивания - отобразит ее в Image, который находится на главной форме. Но что-то оно не хочет работать как надо, вываливаясь с исключением, что что-то там из одного потока не принадлежит второму. В общем исходники: Класс картинки:
using System;
using System.IO;
using System.Net;
using System.Threading;
using System.Windows.Media.Imaging;
 
namespace JPGTest
{
    public class DownloadPicture
    {
        public BitmapImage Picture { get; set; }
        private string Url { get; set; }
 
        public DownloadPicture(string _url)
        {
            Url = _url;
        }
 
        /// <summary>
        /// Начинает загрузку изображения
        /// </summary>
        public void Load()
        {
            WebRequest request = WebRequest.Create(Url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream pic = response.GetResponseStream();
 
            byte[] img;
 
            using (MemoryStream ms = new MemoryStream())
            {
                short tmp = (short)pic.ReadByte();
                while (tmp != -1)
                {
                    ms.WriteByte((byte)tmp);
                    tmp = (short)pic.ReadByte();
                }
                img = ms.ToArray();
            }
 
            using (MemoryStream ms = new MemoryStream(img))
            {
                JpegBitmapDecoder decoder = new JpegBitmapDecoder(ms, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
                BitmapSource bmpSource = decoder.Frames[0];
 
                JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(bmpSource));
 
                using (MemoryStream ms2 = new MemoryStream())
                {
                    encoder.Save(ms2);
 
                    Picture = new BitmapImage();
 
                    Picture.BeginInit();
                    Picture.StreamSource = new MemoryStream(ms2.ToArray());
                    Picture.EndInit();
                }
            }
        }
    }
}
Класс главного окна программы:
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
 
namespace JPGTest
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public DownloadPicture dp { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            dp = new DownloadPicture(@"http://i43.***********/big/2012/0824/6d/3f13eaad98a8800fe71cc180915b4c6d.jpg");
        }
 
        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            Task tsk = new Task(SetPicture);
            tsk.Start();
        }
 
        public void SetPicture()
        {
            dp.Load();
            this.Dispatcher.BeginInvoke((ThreadStart)delegate() { this.viewImg.Source = dp.Picture; });
            Thread.Sleep(20);
        }
    }
}
XAML код главного окна:
<Window x:Class="JPGTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded_1">
    <Grid>
        <Image HorizontalAlignment="Left" Height="291" Margin="10,10,0,0" VerticalAlignment="Top" Width="489" x:Name="viewImg"/>
 
    </Grid>
</Window>
Неужели никто не в курсе?

Решение задачи: «.NET 4.x Многопоточная загрузка картинки с интернета и ее отображение»

textual
Листинг программы
using (MemoryStream ms2 = new MemoryStream())
                {
                    encoder.Save(ms2);
 
                    Picture = new BitmapImage();
 
                    Picture.BeginInit();
                    Picture.StreamSource = new MemoryStream(ms2.ToArray());
                    Picture.EndInit();
                }
                Picture.Freeze();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы