当给出 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
和取消令牌。
答案 0 :(得分:6)
超时和取消令牌不能随意停止异步计算,它们只能在计算产生时使用let!
,do!
等来执行此操作。您的示例计算不会这样做。< / p>
这可以按预期工作。
let rec forever () : Async<unit> =
async {
printfn "Forever looping"
return! forever()
}
let x = runInMaxTime 1000 <| forever()