Asynchronous F#Async:相当于Boost asio';s股

Asynchronous F#Async:相当于Boost asio';s股,asynchronous,concurrency,f#,Asynchronous,Concurrency,F#,Boost的库允许按以下方式序列化异步代码。异步函数(如从流中读取的函数)的处理程序可能与。串与“IO上下文”相关联。IO上下文拥有一个线程池。无论池中有多少线程,都可以保证不会同时运行与同一条链关联的两个处理程序。例如,这使得实现一个状态机成为可能,就好像它是单线程的一样,其中该机器的所有处理程序都在私有链上序列化 我一直在试图弄清楚如何使用F#的Async实现这一点。我找不到任何方法来确保所选的Async进程集永远不会并发运行。有人能建议如何做到这一点吗?了解您试图实现的用例将非常有用。我不

Boost的库允许按以下方式序列化异步代码。异步函数(如从流中读取的函数)的处理程序可能与。串与“IO上下文”相关联。IO上下文拥有一个线程池。无论池中有多少线程,都可以保证不会同时运行与同一条链关联的两个处理程序。例如,这使得实现一个状态机成为可能,就好像它是单线程的一样,其中该机器的所有处理程序都在私有链上序列化


我一直在试图弄清楚如何使用F#的
Async
实现这一点。我找不到任何方法来确保所选的
Async
进程集永远不会并发运行。有人能建议如何做到这一点吗?

了解您试图实现的用例将非常有用。我不认为F#
async
有任何东西可以直接映射到链,您可能会使用不同的技术来实现不同的东西,这些东西可能都是使用链实现的

例如,如果您关心从流中读取数据,则F#
async
块允许您编写异步但连续的代码。下面运行一个逻辑进程(当您使用
let!
等待时,该进程可能会在线程池的线程之间移动):


谢谢你的回复
MaliboxProcessor
更接近我想要的功能。我要寻找的内容的一个总结是:一种在所选串上异步启动任意代码的方法,以便对给定串执行的并发操作不超过一个。有没有一个通用的解决方案可以避免在指定串之前进行任何显式同步?如果存在异步锁,可以这样做。另一个可以使用MailboxProcessor。可以围绕要异步执行的代码创建一个包装器,它本身就是一个回调。调用时,它将使用包装回调(及其参数)向串的邮箱发送消息,并进入执行队列。将有一个异步进程从队列中获取回调并无限期地执行它们。顺便说一下,我不确定最后一个解决方案是否能在F#中工作。我想在邮箱处理器周围安装一个包装器——并将其用作执行队列——会很有效。邮箱处理器的唯一问题是,它们有一个潜在的无限邮件队列,因此您需要确保您永远不需要做超出其管理范围的工作。
let readTest () = async { 
  let fs = File.OpenRead(@"C:\Temp\test.fs")
  let buffer = Array.zeroCreate 10
  let mutable read = 1
  while read <> 0 do
    let! r = fs.AsyncRead(buffer, 0, 10)
    printfn "Read: %A" buffer.[0 .. r-1]
    read <- r }

readTest() |> Async.Start
let agent = MailboxProcessor.Start(fun inbox -> async {
  while true do 
    let! msg = inbox.Receive()
    printfn "Got: %s" msg
    do! Async.Sleep(1000)
})

agent.Post("hello")
agent.Post("world")