如何并行执行两个具有不同结果类型的Async <>调用?

马克·温兹

我有两个异步操作,因此有以下功能:

// 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
    ...
  }

由于两个值具有不同的类型,因此会产生编译错误。(而且,使用这种语法,我如何获得实际结果?)

惯用的方法是什么?

托马斯·佩特里切克(Tomas Petricek)

惯用的方法是使用来开始两个计算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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Rxjava-如何在并行调用两个API时重试具有不同参数的API调用

具有两个不同函数的参数的调用函数

如果两个函数具有相同的参数类型,如何从javascript调用webapi

从具有参数化类型参数的另一个方法调用具有参数化类型参数的方法时,保留特定的结果类型参数

如何调用两个并行返回 DeferredResult<> 的方法?

两个相同函数调用的不同结果

为什么两个相同但连接不同的字符串在用python调用的shell上下文中具有不同的结果?

调用相同的函数将 element.style.display 更改为在具有不同结果的两个不同页面上“阻止”

为什么这两个对addEventListener的javascript调用会有不同的结果

两个连续相同的回声调用在Vim函数中具有不同的输出

这两个获取 Locale 的调用有何不同?

div 调用两个不同的函数

是否可以在 SQL 中同时调用具有不同数据的两个不同表

如何动态调用具有两个条件的 SQLite 数据库中的数据?

如何获得两个不同类型相乘的结果类型?

Javascript对象数组,具有两个方法和两个调用函数

同时执行两个数据库调用(带有两个DbContext)

PHP反射有两个调用

在具有2个不同的.SVC文件的多线程环境中调用WCF服务。同时调用两个服务时出错

如何调用两个onClick JavaScript调用?

如何使用 sequenceT 和 ReaderTaskEither 发出两个具有不同错误类型的并行请求?

当使用两个不同的地址调用inet_ntoa时,其结果相同

如何在F#中将sprintf +调用包装到一个函数中并具有两个签名?

如何从另一个存储过程调用具有两个OUTPUT参数的存储过程

我应该如何并行执行2个或更多json调用?

Javascript-并行调用两个异步函数,并将两个结果都传递给第三个

从两个不同的页面调用一个函数

如何使用两个不同的参数值两次调用我的模拟方法

当两个具有相同名称的javascript类方法如何知道调用函数或方法时?