如何等待F#中的异步方法?
我有以下代码:
type LegoExample() =
let brick = Brick(BluetoothCommunication("COM3"))
let! result = brick.ConnectAsync();
错误:
成员定义中的意外的binder关键字
注意,我查看了以下link:
但是,我只观察功能技术,而不是OOP技术。
答案 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)