簡體   English   中英

異步等待F#中的鍵?

[英]Async to wait for a key in 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嗎?

沒有任務,使用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 ()

您可以編寫不帶Task <-> Async interop位的waitForAnyKey


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

然后,您可以隨時等待輸入來調用它。 您的用法示例將在此實現中正常工作。

Task構造函數將創建一個新Task,但不會啟動它。 使用Task.Run應該可以解決問題:

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

盡管已經提出了這個想法,但Console.ReadKey當前沒有返回Task的等效項(這使我感到驚訝)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM