.NET 4.x Многопоточная загрузка картинки с интернета и ее отображение - C#
Формулировка задачи:
Здравствуйте. Прошу помощи. Попытался тут разобраться с TPL библиотекой, но возникает проблема с одной деталью...
Суть тестового приложения: создаю форму, после формы запускаю второй поток, который скачивает картинку, а по завершении скачивания - отобразит ее в Image, который находится на главной форме. Но что-то оно не хочет работать как надо, вываливаясь с исключением, что что-то там из одного потока не принадлежит второму.
В общем исходники:
Класс картинки:
Класс главного окна программы:
XAML код главного окна:
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); } } }
<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();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д