如何取消装箱Async <string> []

时间:2017-09-01 16:29:13

标签: f# jobs hopac

所以我有一个Async<string> [],就我而言,我无法弄清楚如何拆箱!

我从

开始

Job<Result<string>> []

然后我设法把它送到了

Job<string> []

所以我在Job.toAsync中添加了将其转换为异步的想法可能更容易让出来。 NOPE

现在我有了

Async<string> []

我正在使用Hopac lib

所以我的问题是,如何获得string []

1 个答案:

答案 0 :(得分:4)

你需要以某种方式运行那些asyncs,以便每个都返回一个值。最简单的方法是并行运行它们,因为它有一个内置函数 - 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