clowwindy的杂草牧场

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

这两天在学习wpf的过程中遇到一个问题,当读取很多图像的时候我希望在后台的另一个线程中进行,否则UI会停滞。然而BitmapImage类只能在创建的类中访问,否则会抛出InvalidOperationException。当我在后台线程中创建并初始化BitmapImage后将其赋值给一个image控件,便会因无法访问Image控件而抛出异常。调用image.BeginInvoke()方法在主线程中赋值,又会因无法访问BitmapImage而抛出异常。最后把MSDN里BitmapImage的成员全看了一遍,发现一个Freeze()方法,它的描述是这样的:

 

引用:使当前对象变为不可修改并将其 IsFrozen 属性设置为 true。 (继承自 Freezable。)

 

 

于是抱着试试看的心情点了一下Freezable类,发现有如下说明 :

 

引用:

派生自 Freezable 的类可以获得以下功能:

  • 特殊状态:只读(冻结)状态和可写状态。

  • 线程安全性:可以在线程之间共享冻结的 Freezable 对象。

  • 详细的更改通知:与其他 DependencyObject 对象不同,Freezable 对象可在子属性值更改时提供更改通知。

  • 便于克隆:Freezable 类已经实现了多种生成深层克隆的方法。

 也就是说只要将一个对象Freeze(),便能在线程间共享,而且能提高性能。于是在后台线程中将BitmapImage Freeze()后再交给Image控件,再也没有抛出异常了。

 最终代码:

Code

 

Code

 

posted on 2009-02-13 15:00  clowwindy  阅读(1330)  评论(0编辑  收藏  举报