首页 > 解决方案 > 异步等待 F# 中的键?

问题描述

我想阻止异步执行,直到用户按下控制台中的任何键。

这是我想出的:

let waitForAnyKey = async {
  do!
    new Task (fun () ->
      printfn "%s" "waiting for a key"
      Console.ReadKey () |> ignore
      printfn "%s" "got a key"
    )
    |> Async.AwaitTask
}

像这样使用:

async {
  printfn "%s" "Press any key... "
  do! waitForAnyKey
  printfn "%s" "You pressed a key. "
}

但是,Task永远不会运行。

标签: asynchronousf#

解决方案


没有任务,有Async.FromContinuations

open System

let waitForAnyKey =
    Async.FromContinuations (fun (cont, _, _) ->
        printfn "%s" "waiting for a key"
        cont (Console.ReadKey ())
        printfn "%s" "got a key"
    )

let test () =
    async {
        let! key = waitForAnyKey
        printfn "%O" key.Key
    }
    |> Async.RunSynchronously

test ()

推荐阅读