.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();