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 属性,代码仍能正常运行,但是计算都提前了。
原文地址:http://blog.csdn.net/hadstj/article/details/42774699