asynchronous - 运行超时的异步计算

标签 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取消 token

最佳答案

超时和取消 token 不能任意停止异步计算,它们只能在计算产生时通过使用 let!do! 等来停止。你的例子计算不会那样做。

这会如您所愿地工作。

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

let x = runInMaxTime 1000 <| forever()

关于asynchronous - 运行超时的异步计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19278455/

相关文章:

javascript - 异步函数总是返回 undefined

mysql - Node.JS MySQL 回调

c# - 如何将 C# 类添加到 F# 项目

f# - 在 F# 中使用 array.fold 的累积总和

c# - Socket.Send 是否有可能阻塞代码并需要永远完成?

javascript - Cloudsponge 异步 javascript

javascript - jQuery ajax 异步 : false causes a strange warning?

f# - F# 交互式应用程序是否开源?

visual-studio - 如何在 MSBuild 项目中使用特定版本的 F# 编译器?

f# - 如何将真正是 int32[] 的 System.Object 转换为 double[]?