F#第五课:异步工作流

没来得及写出来学习心得,暂时写一下Expert F#关于异步程序的文章中例子一些过时语法和相应的改进

 

代码
#light
open System
open System.IO
open Microsoft.FSharp.Control
open Microsoft.FSharp.Control.CommonExtensions

let numImages = 200
let size = 512
let numPixels = size * size


let TransfromImage(pixels, imageNum) = 
    printfn 
"TransformImage %d" imageNum
    
// 实现频繁CPU计算操作
    pixels |> (Array.map(fun b -> b + 1uy))

let ProcessImageAsync(i) = 
  async {
    use inStream = File.OpenRead(sprintf 
"Image%d.tmp" i)
    
let! pixels = inStream.ReadAsync(numPixels) // 改为AsyncRead
    let  pixels' = TransfromImage(pixels, i)
    use  outStream = File.OpenWrite(sprintf "Image%d.done" i)
    
do!  outStream.WriteAsync(pixels') // 改为AsyncWrite
  }

let ProcessImagesAsync() = 
  printfn 
"ProcessImagesAsync..."
  
let tasks = [for i in 1..numImages -> ProcessImageAsync(i)]
  Async.Run(Async.Parallel tasks) 
|> ignore // 改为RunSynchronously
  printfn "ProcessImagesAsync finished"
 
另外一处代码是
代码

let processImagesRepeats = 20
let repeatN pixels =
          pixels 
|> Array.map(fun b-> b + 1uy)


let TransformImage (pixels, imageNum) = 
    printfn 
"TransformImage %d" imageNum
    
// 实现频繁CPU计算操作
    [for i in 1..processImagesRepeats -> repeatN pixels] // 原来这里的语法是pixels |> Func.RepeatN processImagesRepeats (Array.map(fun b-> b + 1uy)) 由于Func.RepeatN已经被F#库移除,所以只能用这样的语法代替

let ProcessImageSync (i) = 
    use inStream = File.OpenRead (sprintf 
"Image%d.tmp" i)
    
let pixels   = Array.zeroCreate numPixels
    
let nPixels  = inStream.Read (pixels, 0, numPixels)
    
let pixels'  = TransformImage (pixels, i)
    use outStream = File.OpenWrite (sprintf "Image%d.done" i)
    outStream.Write (pixels
'.[0], 0, numPixels)

 

 

 

posted @ 2009-12-03 23:59  moonz-wu  阅读(426)  评论(0编辑  收藏  举报