使用F#异步工作流程

ZHU*_*ANG -4 f# asynchronous

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

Van*_*oiy 7

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

问题中的描述没有错(尽管没有Async.Run函数).但是关于异步操作的主要问题是如何,他们执行和为什么他们执行的方法是有用的.

  • 一个async块定义的一段代码变成一个Async<'T>对象,它可以被看作是能够在稍后的时间执行的计算.Async 'T在执行完成时返回一个类型的对象- 如果它既没有失败也没有被取消.

  • let!,do!和use!被一个内所用的async块运行另一个异步和,在的情况下let!和use!,其结果绑定到一个名称电流异步内部.与例如normal let,简单地将任何值绑定到名称不同,带有感叹号的版本明确地"导入" 另一个异步的结果.

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

  • 在异步功能提供了很多现成的方式来运行异步操作,例如Async.Start,这是一个异步的简单调度没有结果,Async.RunSynchronously,它运行的异步和,就好像它是一个正常的函数返回其结果,Async.Parallel,它结合了序列将Asyncs并行执行,或者Async.StartAsTask将Async作为独立任务运行.进一步的方法允许在取消或在异常或取消之后对继续的明确控制方面组成Asyncs.

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

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