2

我不理解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什么样的?我想出的唯一可行的方法是基于Tasks 和取消令牌

4

1 回答 1

6

超时和取消令牌不能任意停止异步计算,它们只能在计算产生时通过使用let!do!来这样做。您的示例计算不会这样做。

这将按您的预期工作。

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

let x = runInMaxTime 1000 <| forever()
于 2013-10-09T17:39:04.867 回答