私はこの小さなウェブリスナーのシミュレーションを書いた: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での使用はそれを処分しないので、それが私がリスナーとのトラブル。 –
私は困惑していますが、代わりに 'using'を試しましたか? – Daniel
はいうまく動作しますが、それは匿名関数の最後に配置されているためです。私の現在の問題を解決しますが、私は間違いなく使用バインディングが非同期ワークフローに配置されないことを心配しています。再帰呼び出しがテールがメモリリークの一種であると言及していたものにつながる尾最適化ではないため、おそらくそれが考えられます。 –