使用F#异步工作流程

时间:2015-01-12 12:30:18

标签: asynchronous f#

由于这个问题很大,我会就这个问题发表看法,这样你就可以简单地告诉我是否正确。如果没有,在哪里纠正。如果我的观点是肤浅的,请提供F#异步使用的概述。在μ理解中,要编写异步程序,您需要将异步代码放入" async"阻止像async {expression},并使用" let!"或"使用!"要将名称绑定到基元,那么您需要使用方法来运行此异步表达式,如" Async.Run"。此外,您可以使用异常处理来处理异常,并在必要时取消取消。我也知道在F#核心库中定义了几个原语,以及I / O操作的F#扩展。我只需要确定这些事情之间的关系。如果您认为我对异步工作流程的看法是肤浅的,请提供一个概述用法,就像我上面提到的那样。非常感谢你!

1 个答案:

答案 0 :(得分:7)

这个问题 很大,所以充其量,我可以突出一些想法并指出你学习资源和例子。

问题中的描述没有错误(尽管没有Async.Run函数)。但关于Asyncs的主要观点是他们如何执行为什么他们执行的方式很有用。

  • async块定义了一段成为Async<'T>对象的代码,可以将其视为可以在以后执行的计算。 Async在执行完成后返回类型为'T的对象 - 如果它既没有失败也没有被取消。

  • let!do!use!async块内部用于运行另一个异步,并且在let!use!,将其结果绑定到当前异步内的名称。与例如简单地将任何值绑定到名称的普通let不同,带有感叹号的版本明确地&#34; import&#34;另一个异步的结果

  • 当Async依赖于另一个并等待其结果时,例如使用let!绑定,它通常不会阻塞线程。 Asyncs利用.NET线程池轻松实现并行执行,并且在Async完成另一个Async依赖后,延续运行依赖异步的其余部分。

  • Async functions提供了许多现成的运行Asyncs的方法,例如Async.Start,这是一个简单的异步调度,没有结果Async.RunSynchronously,它运行Async并返回其结果,就好像它是一个普通函数Async.Parallel,它将一系列Asyncs组合成一个并行执行它们的函数,或Async.StartAsTask,它将Async作为一个独立的任务运行。进一步的方法允许Asyncs的组成取消,或在异常或取消后明确控制继续。

在包含等待时间的情况下,Asyncs非常有用:否则阻塞调用可以使用Asyncs来阻止执行,例如在I / O绑定函数中。

我知道的对F#Asyncs的最佳介绍是由F#的首席设计师Don Syme编写或共同编写的:

相关问题