使用超时运行异步计算

时间:2013-10-09 17:11:05

标签: asynchronous f#

当给出 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取消令牌

1 个答案:

答案 0 :(得分:6)

超时和取消令牌不能随意停止异步计算,它们只能在计算产生时使用let!do!等来执行此操作。您的示例计算不会这样做。< / p>

这可以按预期工作。

let rec forever () : Async<unit> =
    async {
        printfn "Forever looping"
        return! forever()
    }

let x = runInMaxTime 1000 <| forever()