gpt4 book ai didi

asynchronous - F# 异步处理

转载 作者:行者123 更新时间:2023-12-03 09:28:56 26 4
gpt4 key购买 nike

我写了这个小小的网络监听器模拟:

Agent.Start(fun (_ : MailboxProcessor<unit>) ->
let listener = new HttpListener()
listener.Prefixes.Add(addr)
listener.Start()

let rec respondOut() = async {
let! context = Async.FromBeginEnd(listener.BeginGetContext, listener.EndGetContext)
use s = context.Response.OutputStream
let wr = new StreamWriter(s)
use disp = { new IDisposable with
member x.Dispose() =
printfn "Disposing..."
wr.Dispose() }
wr.Write("Test")
return! respondOut()
}

respondOut()
)

我不明白为什么每次循环都没有在 disp 上调用 Dispose?

作为一个附带问题,我这样做是因为我想测试在 Web 服务中响应文本的正确行为是什么。我不确定我是否应该这样做:

use s = Context.Response.OutputStream
use sw = new StreamWriter(s)
sw.Write("test")

Context.Response.Write("Test")
Context.Response.End()

什么的。

谢谢!

最佳答案

如有疑问,请使用反射器 :)。 use 关键字创建“使用”的范围,直到 block 结束。在 async 工作流程中使用时,如果您对 async 关键字进行去糖,您将获得类似以下内容:

Async.Bind(Async.FromBeginEnd(listener.BeginGetContext, listener.EndGetContext)
(fun context ->
use s = context.Response.OutputStream
let wr = new StreamWriter(s)
use disp = { new IDisposable with
member x.Dispose() =
printfn "Disposing..."
wr.Dispose() }
wr.Write("Test")
Async.ReturnFrom ( respondOut() )
)

现在调用 Async.ReturnFrom 最终将继续递归调用该函数,如果您将 use 替换为“C# using() { }”,其中 } 括号位于 Async.ReturnFrom 之后,那么 dispose 将永远不会被调用

将 use 部分包装在 do block 中应该可以解决问题:

let rec respondOut() = async {
let! context = Async.FromBeginEnd(listener.BeginGetContext, listener.EndGetContext)
do
use s = context.Response.OutputStream
let wr = new StreamWriter(s)
use disp = { new IDisposable with
member x.Dispose() =
printfn "Disposing..."
wr.Dispose() }
wr.Write("Test")
return! respondOut()
}

关于asynchronous - F# 异步处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7433426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com