在 C# 中等待任务等待器是或 ConfiguredTaskAwaitable 非常简单 - 只需使用await
. F# 的替代方案是什么?
let! result = ...? doSomething().ConfigureAwait(false) ...?
Run Code Online (Sandbox Code Playgroud)
F# async 工作流和 C# async-await 关键字是两种完全独立的机制,因此它们不直接兼容(尽管毫无疑问,您可以使用包装器使之成为可能,并且很可能已经有这样的包装器)。
如果您想将任务与 F# 异步工作流结合起来,您将使用实际任务而不是等待者:
let! result = Async.AwaitTask task
Run Code Online (Sandbox Code Playgroud)
如果您有一个 API 为您提供等待者而不是任务,那么这里有一个粗暴的尝试,可以从 a 中实现异步TaskAwaiter<'T>
:
module Async =
let fromTaskAwaiter (awaiter: TaskAwaiter<'a>) =
async {
use handle = new SemaphoreSlim(0)
awaiter.OnCompleted(fun () -> ignore (handle.Release()))
let! _ = handle.AvailableWaitHandle |> Async.AwaitWaitHandle
return awaiter.GetResult()
}
Run Code Online (Sandbox Code Playgroud)