Asynchronous F中异步操作的顺序执行链#

Asynchronous F中异步操作的顺序执行链#,asynchronous,f#,sequential-workflow,Asynchronous,F#,Sequential Workflow,语言中是否有编写async1然后async2的原语,类似于parallel为并行执行规划所做的工作 为了进一步澄清,我有两个异步计算 let toto1 = Async.Sleep(1000) let toto2 = Async.Sleep(1000) 我想创建一个新的异步计算,由toto1和toto2的顺序组合组成 let toto = Async.Sequential [|toto1; toto2|] 启动时,toto将先运行toto1,然后运行toto2,并在2000个时间

语言中是否有编写async1然后async2的原语,类似于parallel为并行执行规划所做的工作

为了进一步澄清,我有两个异步计算

  let toto1 = Async.Sleep(1000)
  let toto2 = Async.Sleep(1000)
我想创建一个新的异步计算,由toto1和toto2的顺序组合组成

  let toto = Async.Sequential [|toto1; toto2|]

启动时,toto将先运行toto1,然后运行toto2,并在2000个时间单位后结束

我不确定您所说的“基元”是什么意思。
Async.Parallel
是一个函数。以下是运行两个异步的几种方法:

同时:

Async.Parallel([|async1; async2|])

依次:

async {
  let! result1 = async1
  let! result2 = async2
  return [|result1; result2|]
}
可以返回最后两个元组中的元组。我保持了与第一个相同的返回类型


我会说,
let
执行async{}
块中的code>与使用原语进行此操作最接近

编辑 如果所有这些讨厌的语法都让你感到困惑,你可以定义一个组合词:

let (<|>) async1 async2 = 
  async {
    let! r1 = async1
    let! r2 = async2
    return r1, r2
  }
let()async1 async2=
异步的{
设!r1=async1
设!r2=async2
返回r1,r2
}
然后做:

async1 <|> async2 |> Async.RunSynchronously
async1 async2 |>Async.RunSynchronously

异步.Bind操作是异步工作流为顺序合成提供的基本原语,在
async
块语法中,它对应于
let。您可以使用它来表示两个计算的顺序组合(如Daniel所示)

但是,如果您有Daniel定义的操作
,则该操作的表达性不足以实现
async.Bind
,因为当您使用
async.Bind
按顺序编写内容时,第二次计算可能取决于第一次计算的结果。
可以使用
v1

async.Bind(<e1>, fun v1 -> <e2>)

这里有什么可以“尝试”的?是的,我通过阅读msdn上的API来“尝试”回答我的问题。你想要什么?@nicolas你甚至没有表示你读过任何东西。通过告诉我们您所看的内容或显示您试图解决此问题的代码,您可以防止我们重复或响应,就像您刚刚决定提问而不是做任何事情一样。@nicolas我会称查看文档为“尝试”以找到答案,不是吗?也就是说,
Async
不是原语,它是.Net框架的一部分。您需要进入框架并编写一些代码。您不能使用生成async2的延续吗?在您的示例中,
toto
是什么?它是由
toto1
还是
tototo2
造成的?你想对另一个结果做什么?忽略它?你想把它们结合起来吗?如果是这样的话,怎么做呢?所谓原语,我指的是一个不是由简单函数组合而成的函数,也就是语言中的某个东西。
let
执行
是连续体的语法糖,这是您想要的。它们还不够“原始”吗?谢谢你,丹尼尔,我很早就知道我可以写一个组合词,但就像有一个用于//计算的组合词一样,我只是想知道是否还有另一个隐藏在某处。可能是他们没有添加它,因为如果你想处理组合的一般情况,它就不那么简单了,呼叫链的类型必须兼容。对于单位来说,这当然是微不足道的。(实际上,对于无限序列,它可能无法在类型系统中表示)是的,我认为通用的
bind
是不可能的。你不知道,对于每一个好奇的举动,这个函数是否会与
async1 async2有什么不同。。。asyncN
在我的回答中使用组合符?有趣的是,它不是Async.Bind,而是Async.Bind。我完全忽略了这一点,正在查看MSDN中的control.Async模块。(将此项添加到Async中以获得规律性可能会很好)@nicolas啊,是的,很抱歉造成混淆:-)
Bind
操作是Async计算生成器(Async
值)的一部分,用于翻译
Async{..}
块。附加的组合器在模块中公开(作为静态成员)。
async.Bind(<e1>, fun v1 -> <e2>)
let Sequential (ops:Async<'T>[]) = async {
  let res = Array.zeroCreate ops.Length
  for i in 0 .. ops.Length - 1 do
    let! value = ops.[i]
    res.[i] <- value 
  return res }