Если есть сомнения, используйте отражатель :). Ключевое слово use создает область действия «using» до конца блока. При использовании внутри асинхронного рабочего процесса, если вы удалите сахар из асинхронного ключевого слова, вы получите что-то вроде:
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, наконец, продолжит рекурсивный вызов функции, и если вы замените использование на «C # using () {}», где скобка} стоит после Async.ReturnFrom, тогда удаление никогда не будет вызвано
Оборачивание используемой части в блок do должно решить проблему:
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()
}