我如何等待F#中的异步方法?
我有以下代码:
type LegoExample() =
let brick = Brick(BluetoothCommunication("COM3"))
let! result = brick.ConnectAsync();
Run Code Online (Sandbox Code Playgroud)
错误:
成员定义中出现意外的binder关键字
请注意,我查看了以下链接:
但是,我只观察功能技术,而不是OOP技术.
Car*_*ten 12
你得到错误是因为let!构造(就像do!)需要放在一个计算工作流程中(就像async { ...}其他人一样 - 它基本上就是F#给你的单词的语法糖 - 在C#中它将成为from ... select ...LINQ带来的东西Haskell它会是do ...块)
所以假设brick.ConnectAsync()确实会返回一些,Async<...>那么你可以像这样等待它Async.RunSynchronously:
let brick = Brick(BluetoothCommunication("COM3"))
let result = brick.ConnectAsync() |> RunSynchronously
Run Code Online (Sandbox Code Playgroud)
遗憾的是,您链接的页面上没有找到快速的浏览器搜索,ConnectAsync因此我无法准确地告诉您该片段的缩进是什么,但很可能您希望将此async { ... } 块放在这样的块中:
let myAsyncComputation =
async {
let brick = Brick(BluetoothCommunication "COM3")
let! result = brick.ConnectAsync()
// do something with result ...
}
Run Code Online (Sandbox Code Playgroud)
(请注意,我删除了一些不必要的括号等)
然后你可以用它 myAsyncComputation
async { .. }工作流程内Async.RunSynchronously运行并等待它Async.Start在后台运行它(您的块需要具有Async<unit>此类型Async.StartAsTask开始并获得Task<...>它