F# 对流进行节流,以便在收到对上一次写入的响应之前,写入将一直排队

F# 对流进行节流,以便在收到对上一次写入的响应之前,写入将一直排队,f#,F#,假设我有一个流,它一次只允许一个请求/响应,但在多个线程中使用 应限制请求/命令,以便新请求只能发生一次 已发送上一个请求并收到答复 用户将能够做到这一点 let! res = getResponse("longResp") let! res2 = getResponse("shortResp") 不知道也不关心油门 我尝试了Tomas Petricek的一个修改版本,该版本允许与返回值异步,但这需要用户调用getResponse(“..”)|>Enqueue |>w.Post,这会导致灾难(

假设我有一个流,它一次只允许一个请求/响应,但在多个线程中使用

应限制请求/命令,以便新请求只能发生一次 已发送上一个请求并收到答复

用户将能够做到这一点

let! res = getResponse("longResp")
let! res2 = getResponse("shortResp")
不知道也不关心油门

我尝试了Tomas Petricek的一个修改版本,该版本允许与返回值异步,但这需要用户调用
getResponse(“..”)|>Enqueue |>w.Post
,这会导致灾难(以防他们忘记这么做)


在F#?

中是否有一种很好的/惯用的方法来实现这一点,然后在您的类型系统中明确表示返回的类型需要用另一个函数展开。因此,与其返回异步
type Queuable<'T> = Queuable of Async<'T>
let getResponse (s:string) =
  let r =
    async{
    do! write to your stream
    return! read from your stream
  }
Queuable r
let enqueue (Queuable q) = async{
  return! processor.PostAndAsyncReply(fun replyChannel -> replyChannel,q)
}
let processor = new MailboxProcessor<_>(fun inbox ->
  let rec Loop() = async {
    let! (r:AsyncReplyChannel<_>,job) = inbox.Receive()
    let! res = job
    r.Reply res
    return! Loop()}
  Loop())