这两天在学习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控件,再也没有抛出异常了。
最终代码:


1

2

3

4

5

6

7

8

9



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17



18


19

20

21

22



23

24



25

26

27

28

29



30

31

32

33

34



35

36

37

38

39

40

41

42

43



44

45

46

47

48

49

50
