当给出超时参数时,我不理解Async.RunSynchronously的语义。为什么下面的示例不终止?
let runInMaxTime (time: int) (work: Async<'T>) =
try
Async.RunSynchronously(work,time)
|> Some
with
| _ ->
None
let rec forever () : unit =
printfn "Forever looping"
forever ()
// Never terminates
let x = runInMaxTime 10 <| async {return forever ()}runInMaxTime的适当实现是什么样子的?我想出的唯一有效方法是基于Task和取消令牌。
发布于 2013-10-09 17:39:04
超时和取消令牌不能任意停止异步计算,它们只能在计算产生结果时才能停止,使用let!、do!等。您的示例计算不能这样做。
这会像你期望的那样起作用。
let rec forever () : Async<unit> =
async {
printfn "Forever looping"
return! forever()
}
let x = runInMaxTime 1000 <| forever()https://stackoverflow.com/questions/19278455
复制相似问题