我有两个异步操作,因此有以下功能:
// Returs Async<Person>
let GetPerson =
...
// Returs Async<Address>
let GetAddress =
...
并行执行它们并获得结果的惯用方式是什么?
我的出发点是这种方法。
let MyFunc = async {
let! person = GetPerson()
let! address = GetAddress()
...
}
可以,但是按顺序运行两个操作。
我也尝试过这个(基于我的C#经验)。
let MyFunc = async {
let personA = GetPerson()
let addressA = GetAddress()
let! person = personA
let! address = addressA
...
}
但是它不起作用,它还会顺序运行两个操作。
大多数文档说的是Async.Parallel
与序列一起使用,但是问题在于两个操作的结果类型不同,因此我无法将它们放在序列中。
let MyFunc = async {
let personA = GetPerson()
let addressA = GetAddress()
[personA; addressA]
|> Async.Parallel
...
}
由于两个值具有不同的类型,因此会产生编译错误。(而且,使用这种语法,我如何获得实际结果?)
惯用的方法是什么?
惯用的方法是使用来开始两个计算Async.StartAsChild
,然后使用秒等待它们完成let!
:
let MyFunc = async {
let! personWork = GetPerson() |> Async.StartChild
let! addressWork = GetAddress() |> Async.StartChild
let! person = personWork
let! address = addressWork
// (...)
}
仅仅调用GetPerson
实际上并不能启动工作-与在C#中创建任务开始的情况不同,F#工作流只是要完成的工作的描述,因此需要明确地启动它们。该Async.StartChild
操作为您提供了一个工作流,该工作流开始工作并返回另一个可用于等待完成的工作流。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句