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

时间:2016-02-20 11:16:20

标签: f# async-await

如何等待F#中的异步方法?

我有以下代码:

 type LegoExample() = 

    let brick = Brick(BluetoothCommunication("COM3"))
    let! result = brick.ConnectAsync();

错误:

  

成员定义中的意外的binder关键字

注意,我查看了以下link

但是,我只观察功能技术,而不是OOP技术。

1 个答案:

答案 0 :(得分:9)

您收到错误,因为let!构造(就像do!)需要放在计算工作流程中(例如async { ...}但是有from ... select ...其他 - 它基本上是F#为你提供monach的语法糖 - 在C#中它将是LINQ附带的do ...内容,而在Haskell中它将是brick.ConnectAsync()块)

所以假设Async<...>确实会返回一些Async.RunSynchronously,那么您可以使用let brick = Brick(BluetoothCommunication("COM3")) let result = brick.ConnectAsync() |> RunSynchronously 等待,如下所示:

ConnectAsync

遗憾的是,您链接的网页上的快速浏览器搜索未找到async { ... },因此我无法确切地告诉您该片段的缩进是什么,但很可能您希望将其置于let myAsyncComputation = async { let brick = Brick(BluetoothCommunication "COM3") let! result = brick.ConnectAsync() // do something with result ... } 内阻止这样:

myAsyncComputation

(请注意我删除了一些不必要的括号等。)

然后您可以使用此async { .. }

  • 在另一个Async.RunSynchronously工作流程
  • Async.Start一起运行并等待它
  • 使用Async<unit>在后​​台运行它(您的块需要为此类型Async.StartAsTask
  • Task<...>开始并从中获取FATAL EXCEPTION: main Process: example.testjni, PID: 10923 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/example.testjni-1/base.apk"],nativeLibraryDirectories=[/data/app/example.testjni-1/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libhello-jni.so" at java.lang.Runtime.loadLibrary(Runtime.java:366) at java.lang.System.loadLibrary(System.java:989) at evanescentwave.testjni.MainActivity.<clinit>(MainActivity.java:21) at java.lang.reflect.Constructor.newInstance(Native Method)
  • ...