我写了这个小Web侦听器模拟:F#异步处置
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呼吁每一个循环?
作为一个侧面问题,我正在做这一切,因为我想测试什么是正确的行为来响应Web服务中的文本。我不知道我是否应该做的:
use s = Context.Response.OutputStream
use sw = new StreamWriter(s)
sw.Write("test")
或
Context.Response.Write("Test")
Context.Response.End()
或诸如此类的东西。
谢谢!
删除它,并把在wr上使用并不能解决这个问题,这就是我为什么要这样做的原因听众的麻烦。 –
我很难过,但你尝试过使用'而不是? – Daniel
是的,它工作正常,但这是因为它放置在匿名函数的末尾。解决了我目前的问题,但让我绝对担心使用绑定不会在异步工作流中处理。我想也许是因为递归调用没有被尾部优化,导致了Tomas曾经提到过的一种内存泄漏。 –