11.4.2.1 使用延迟值进行缓存

来源:互联网 发布:win7红警网络点不进去 编辑:程序博客网 时间:2024/06/01 08:42

11.4.2.1 使用延迟值进行缓存

 

应用程序中最重要的部分是,应用程序启动时执行的代码,找到指定目录中的所有文件,并创建有关每个文件信息的数组;这些信息包含文件名,和为了展示调整大小而计算的延迟值。清单 11.21 是为此而创建的数据结构。

 

清单 11.21 创建有关图片信息的集合 (F#)

open System.IO

open System.Drawing

 

type ImageInfo = { Name : string; Preview :Lazy<Bitmap> }   [1]

 

let dir = @"C:\My Photos"   <-- 指定图片的目录

let createLazyResized(file) =   [2]

 lazy( use bmp = Bitmap.FromFile(file)  <-- 自动管理清单工作

         let resized = new Bitmap(400, 300)

         use gr = Graphics.FromImage(resized)

 

         let dst = Rectangle(0, 0, 400, 300)                        |

         let src = Rectangle(0, 0, bmp.Width, bmp.Height)           | 在目标位置

         gr.InterpolationMode <- Drawing2D.InterpolationMode.High  | 绘制指定大小

         gr.DrawImage(bmp, dst, src, GraphicsUnit.Pixel)             | 的位图

         resized)

 

let files =

 Directory.GetFiles(dir, "*.jpg") |> Array.map (fun file–>;

    {Name = Path.GetFileName(file)       | [4]

      Preview = createLazyResized(file) }) |

 

我们首先声明一个记录类型[1],表示有关照片的信息。可以看到,preview 的类型是 Lazy<Bitmap>,是延迟计算,在需要时,能提供位图(Bitmap)。接下来,我们实现一个函数,返回的延迟值表示指定大小的位图[2]。要绘制预览,使用通常调整位图对象的代码,并把整个函数体用 lazy 关键字包装起来。

接下来,我们创建包含有关图片信息的数据结构[3]。使用通常的 .NET 法调用获得文件数组,并使用 Array.map 函数,为每张图片创建 ImageInfo 值。在 lambda 函数的内部,创建一个记录值,包含文件名,和由 createLazyResized 函数返回的延迟预览。

程序有一个很有趣的现象,我们可以删除所有使用的 lazy关键字,把所有的Lazy<'T> 类型改为 'T,并删除所有使用的 Value 属性,代码仍能正常运行,但是计算都提前了。

0 0