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
完全避免为此创建一个吗?
解决方案
没有任务,有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 ()
推荐阅读
- c# - 在 Android 上发现附近的智能手机设备
- java - 将按钮添加到包含 ListView 的 XML 文件
- python - 嵌套列表索引的问题
- ios - 将项目附加到字典中的数组不起作用
- python - Python 中的 nargin 功能(来自 Matlab)
- php - Guzzle HTTP 客户端和 Shopify 访问令牌异常
- string - 如何在 Perl 6 中打开字符串的文件句柄?
- azure-active-directory - 如何使用 Graph API 按 Actor 过滤 Azure AD 审计
- cors - 从 Swagger Editor 发出请求时,如何避免 CORS 错误(“无法获取”或“未找到服务器或发生错误”)?
- design-patterns - keras中的继承与组合——为什么模型是从网络继承的