【问题标题】:How to get the result of Async Tasks in F#如何在 F# 中获取异步任务的结果
【发布时间】:2021-02-11 09:47:10
【问题描述】:

我正在尝试获取该语句的结果并在下一条语句中使用它,但我认为我不太了解它的异步性质。订单是记录的集合,我正在尝试获取订单详细信息,但最终得到类型 seq 并且不确定如何获取结果的集合。在 nodejs 中,我会使用异步函数并等待订单...(等)

let fullOrders = 
    orders.AsParallel().WithDegreeOfParallelism(6) |>
    Seq.map (fun (order) -> getOrderInfoApi(client1, order.increment_id ))

【问题讨论】:

    标签: f#


    【解决方案1】:

    我假设你得到一个任务集合,因为getOrderInfoApi 返回一个Task

    首先,我认为您正在尝试混合两种不同的东西。当您想要并行处理各个步骤同步的数据处理(例如计算)时,您通过AsParallel 使用的ParallelQuery API 非常有用。但是,您也可以在getOrderInfoApi 中使用Task 来实现异步,这是另一种并发。你真的只需要使用其中之一。如果getOrderInfoApi 已经是异步的,那么问题是如何并行运行所有返回的任务。

    您可以使用Task.WhenAll 执行此操作。这为您提供了一个任务,该任务将在完成时返回所有结果。您可以同步等待,或在其他异步上下文中使用它(取决于您正在构建的应用程序的类型):

    let tasks = 
      orders 
      |> Seq.map (fun (order) -> getOrderInfoApi(client1, order.increment_id ))
      |> Task.WhenAll
    
    // This will block the current thread until all `getOrderInfoApi` complete
    let res = tasks.Result
    

    也就是说,如果您是 F# 新手,并且不确定哪种异步编程抽象最适合您,那么我会推荐 looking into F# asynchronous workflows 而不是任务。

    【讨论】:

      猜你喜欢
      • 2013-12-27
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多