Using threading in WPF makes no difference for me. The UI continues to be not responsive.
This is my code:
private void button1_Click_1(object sender, RoutedEventArgs e)
{
Thread th = new Thread(new ThreadStart(LoadImages));
th.Start();
}
void LoadImages()
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, new System.Windows.Forms.MethodInvoker(delegate() {
IService1 svc = ConnectAndGetObject();
foreach (byte[] imgbytes in svc.GetImageDateWise(datePicker1.DisplayDate, DateTime.Now, "test"))
{
using (MemoryStream mem = new MemoryStream(imgbytes))
{
BitmapImage jpgimage = new BitmapImage();
jpgimage.BeginInit();
jpgimage.CacheOption = BitmapCacheOption.OnLoad;
jpgimage.StreamSource = mem;
jpgimage.EndInit();
// PngBitmapDecoder decodejpg = new PngBitmapDecoder(mem, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnDemand);
Image wpfimage = new Image();
wpfimage.Source = jpgimage.Clone();
lbx.Items.Add(wpfimage);
lbx.UpdateLayout();
Thread.Sleep(1000);
}
}
}));
}
Updated working code:
List<MemoryStream> mems = new List<MemoryStream>();
void LoadImages()
{
IService1 svc = ConnectAndGetObject();
foreach (byte[] imgbytes in svc.GetImageDateWise(GetDate(), DateTime.Now, "test"))
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate() {
mems.Add(new MemoryStream(imgbytes));
BitmapImage jpgimage = new BitmapImage();
jpgimage.BeginInit();
jpgimage.CacheOption = BitmapCacheOption.None;
jpgimage.StreamSource = mems[mems.Count-1];
jpgimage.EndInit();
Image wpfimage = new Image();
wpfimage.Source = jpgimage.Clone();
lbx.Items.Add(wpfimage);
lbx.UpdateLayout();
Thread.Sleep(500);
}));
}
mems.Clear();
}