在给定 timeout 参数时,我不理解 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
和 取消 token 。
最佳答案
超时和取消 token 不能任意停止异步计算,它们只能在计算产生时通过使用 let!
、do!
等来停止。你的例子计算不会那样做。
这会如您所愿地工作。
let rec forever () : Async<unit> =
async {
printfn "Forever looping"
return! forever()
}
let x = runInMaxTime 1000 <| forever()
关于asynchronous - 运行超时的异步计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19278455/