异步等待F#中的键?

时间:2019-05-31 16:02:02

标签: asynchronous 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从未运行。

  • 我应该如何用F#编写此代码?
  • 我可以完全避免为此创建一个Task吗?

3 个答案:

答案 0 :(得分:2)

没有任务,带有Salary

Async.FromContinuations

答案 1 :(得分:1)

您可以在没有任务<->异步互操作位的情况下写waitForAnyKey


let waitForAnyKey = async {
  do Console.ReadKey () |> ignore
}

然后您可以随时等待输入来调用它。您的用法示例将在此实现中正常工作。

答案 2 :(得分:0)

Nativescript构造函数会创建一个新Task,但不会启动它。改用Task.Run应该可以解决问题:

Task

Console.ReadKey当前不具有返回Task的等效项(这使我感到惊讶),尽管这个想法has been suggested.