《Programming F#》读书笔记八
索引
- 《Programming F#》读书笔记一
 - 《Programming F#》读书笔记二
 - 《Programming F#》读书笔记三
 - 《Programming F#》读书笔记四
 - 《Programming F#》读书笔记五
 - 《Programming F#》读书笔记六
 - 《Programming F#》读书笔记七
 - 《Programming F#》读书笔记八
 - 《Programming F#》读书笔记九
 - 《Programming F#》读书笔记十
 - 《Programming F#》读书笔记十一
 - 《Programming F#》读书笔记十二
 
笔记
并行框架
Parallel.For
Array.Parallel
Array.Parallel.iter
Array.parallel.map
Array.Parallel.choose
.Net并行扩展 (PFX)
PFX按照CPU剩余资源和CPU处理器个数决定同时处理多少个任务
let task = Task.Factory.StartNew<string>(taskBody) //创建一个并行任务
let x = task.Result
访问Result将进行以下处理:
1.如果任务已结束,则返回结果
2.如果任务已开始,等待任务完成
3.如果任务未执行,则在当前线程执行
Task.WaitAll 等待所有任务完成
Task.WaitAny 等待任一任务完成 取消任务:
需要自行判断何时取消任务
open System
open System.Threading
open System.Threading.Tasks
let longTaskCTS = new CancellationTokenSource()
let longRunningTask() =
    let mutable i = 1
    let mutable loop = true
    while i <= 10 && loop do
        printfn "%d..." i
        i <- i + 1
        Thread.Sleep(1000)
        // Check if the task was cancelled
        if longTaskCTS.IsCancellationRequested then
            printfn "Cancelled; stopping early."
            loop <- false
    printfn "Complete!"
let startLongRunningTask() =
    Task.Factory.StartNew(longRunningTask, longTaskCTS.Token)
let t = startLongRunningTask()
// ...   
longTaskCTS.Cancel()
异常:
任务抛出System.AggregateException类型包装的异常
try
    let treasureFindingTask =
        Task.Factory.StartNew<int>(fun () -> findAllTreasure colossalCave)
    printfn "Found %d treasure!" treasureFindingTask.Result
with
| :? AggregateException as ae ->
    // Get all inner exceptions from the aggregate exception.
    let rec decomposeAggregEx (ae : AggregateException) =
        seq {
            for innerEx in ae.InnerExceptions do
                match innerEx with
                | :? AggregateException as ae -> yield! decomposeAggregEx ae
                | _ -> yield innerEx
        }
    printfn "AggregateException:"
    // Alternately, you can use ae.Flatten() to put all nested
    // exceptions into a single AggregateException collection.
    decomposeAggregEx ae
    |> Seq.iter (fun ex -> printfn "\tMessage: %s" ex.Message)
从我的百度空间导入