Asynchronous F中异步操作的顺序执行链#
语言中是否有编写async1然后async2的原语,类似于parallel为并行执行规划所做的工作 为了进一步澄清,我有两个异步计算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个时间
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 }