我如何在F#中等待异步方法

Sco*_*rod 8 f# async-await

我如何等待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<...>
  • ...