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 とcancel tokensに基づいていることだけです。

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 に答える