【发布时间】:2016-12-31 21:48:26
【问题描述】:
是否有异步操作符来获取两个异步值首先返回的值(Async<_>)?
例如,给定两个 Async<_> 值,其中一个 A1 在 1 秒后返回,A2 在 2 秒后返回,那么我想要 A1 的结果。
原因是我想为异步序列实现一个交错函数,这样如果有两个异步序列像这样“定义”(空格表示时间,就像大理石图一样):
S1 = -+-----+------------+----+
S2 = ---+-------+----------+-----+
然后我想生成一个新的异步序列,行为如下:
S3 = -+-+---+---+--------+-+--+--+
交错 S1 S2 = S3
但是两个这样做,我可能需要一种异步选择运算符来选择选择值。
我认为这就像 Go 中的“选择”,您可以从两个通道中获取第一个可用值。
TPL 有一个名为 Task.WhenAny 的函数——我可能在这里需要类似的东西。
【问题讨论】:
-
我不确定您实际上是否可以非常轻松地从异步选择构建异步交错(因为您所描述的选择必须运行 A1 和 A2 并丢弃 A2,而您想使用它)。你的异步序列是什么类型的?
-
您能否将消费者实现为MailboxProcessor,并让 S1 和 S2 都向其发布消息? MailboxProcessor 将按 S3 顺序获取消息。
-
类型在这里定义:tomasp.net/blog/async-sequences.aspx。你是对的,我不想丢弃其他计算,我只想按照完成的顺序使用它们的结果。
-
@JohnReynolds 可能。大概。不过,我对开销尽可能低的解决方案感兴趣。我也许可以在操作中隐藏代理,并且仍然在它们到达时异步提取值。我希望操作返回与其参数相同类型的值,以实现组合设计。
标签: asynchronous f# task-parallel-library sequence