使用超时运行异步计算

ese*_*los 2 f# asynchronous

我不理解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 ()}
Run Code Online (Sandbox Code Playgroud)

适当的实现runInMaxTime会是什么样的?我提出的唯一有效的方法是基于Tasks和取消令牌.

Lea*_*and 6

超时和取消标记不能随意停止异步计算,他们只能这样做,当计算收益率,用let!,do!等你的计算示例没有做到这一点.

这将按预期工作.

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

let x = runInMaxTime 1000 <| forever()
Run Code Online (Sandbox Code Playgroud)