你需要以某種方式運行這些異步操作,讓每一個你的回報價值。最簡單的方法是並行運行它們,因爲在那裏,它內置的功能 - Async.Parallel
。這個函數異步操作的序列,並返回一個數組,然後你就可以用Async.RunSynchronously
或類似運行的異步:或者
let asyncs : Async<string> [] = ...
let results = asyncs |> Async.Parallel |> Async.RunSynchronously
,如果你想讓他們按順序運行,您可以通過一個運行它們之一,隨時隨地積累結果。不幸的是,沒有內置函數來做到這一點,所以你必須自己編寫它。事情是這樣的:
let runEm asyncs =
let loop rest resultsSoFar =
match rest with
| x::xs ->
async {
let! r = x
return! loop xs (r:resultsSoFar)
}
| [] ->
async { return resultsSoFar }
async {
let! ress = loop asyncs []
return ress |> List.reverse
}
// Usage:
let asyncs : Async<string> [] = ...
let results = runEm asyncs |> Async.RunSynchronously