这两天在学习wpf的过程中遇到一个问题,当读取很多图像的时候我希望在后台的另一个线程中进行,否则UI会停滞。然而BitmapImage类只能在创建的类中访问,否则会抛出InvalidOperationException。当我在后台线程中创建并初始化BitmapImage后将其赋值给一个image控件,便会因无法访问Image控件而抛出异常。调用image.BeginInvoke()方法在主线程中赋值,又会因无法访问BitmapImage而抛出异常。最后把MSDN里BitmapImage的成员全看了一遍,发现一个Freeze()方法,它的描述是这样的:
于是抱着试试看的心情点了一下Freezable类,发现有如下说明 :
也就是说只要将一个对象Freeze(),便能在线程间共享,而且能提高性能。于是在后台线程中将BitmapImage Freeze()后再交给Image控件,再也没有抛出异常了。
最终代码:
Code
Code