【问题标题】:How to convert a sequence of Task<MyType> to a sequence of MyType如何将 Task<MyType> 序列转换为 MyType 序列
【发布时间】:2019-03-29 13:45:58
【问题描述】:

所以我目前有一个seq&lt;System.Threading.Tasks.Task&lt;Restaurant&gt;&gt; 类型的序列,我想把它变成seq&lt;Restaurant&gt; 类型的序列。

我目前正在使用 TaskBuilder.fs 库,根据我的研究,我需要使用任一 let!或者做!对于这种情况,但他们需要task {},当与 Seq.map 一起使用时,会返回相同的任务类型。

let joinWithReviews (r : Restaurant) =
    task {
        let! reviewResult = Reviews.Database.getByLocationId cnf.connectionString r.Restaurant_Id
        match reviewResult with
        | Ok reviewResult ->
            let restaurant = { r with Reviews = (List.ofSeq reviewResult)}
            return restaurant
        | Error ex ->
            return raise ex
    }

let indexAction (ctx : HttpContext) =
    task {
        let (cnf:Config) = Controller.getConfig ctx
        let! result = Restaurants.Database.getAll cnf.connectionString
        match result with
        | Ok result ->
            let restaurantWithReviews = (Seq.map joinWithReviews result)
            return index ctx (List.ofSeq restaurantWithReviews)
        | Error ex ->
            return raise ex
    }

所以我的结果是 Seq&lt;Restaurant&gt; 类型,我需要为每家餐厅添加评论,所以我使用 Seq.map 来获取我无法使用的 seq&lt;System.Threading.Tasks.Task&lt;Restaurant&gt;&gt; 类型的 restaurantWithReviews。

【问题讨论】:

  • 您是否尝试并行执行某些处理?
  • 我不需要并行处理它,但我的数据库调用属于 Task 类型,我使用的框架需要与我的 IndexAction 相同。
  • 要将seq&lt;Task&lt;TResult&gt;&gt; 转换为seq&lt;TResult&gt;,最简单的方法是简单的|&gt; Seq.map (fun task -&gt; task.Result)MSDN docs 表示访问 Task 的 Result 属性将阻塞线程,直到结果可用,请注意这将是顺序的,而不是并行的。但这绝对是满足您需要的最简单、最简单的方法。
  • 谢谢!这足以满足我的需求。
  • 如果我想按顺序运行Seq.map 而不必通过调用task.Result 来阻塞线程怎么办?

标签: f# task saturn-framework


【解决方案1】:

.NET 方法System.Threading.Tasks.Task.WhenAll 会将seq&lt;Task&lt;'a&gt;&gt; 转换为Task&lt;'a[]&gt;。如果您在 task { } 块内,则可以使用 let! 获得结果。

let restaurants: seq<Restaurant>

let! withReviews: Restaurant[] =
    restaurants
    |> Seq.map joinWithReviews
    |> Task.WhenAll

【讨论】:

  • 谢谢!这就是诀窍。类型有点偏,很容易在它们之间切换。
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2023-04-05
  • 2017-07-10
  • 2012-11-29
  • 2012-07-27
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多