如何在 F# 中等待 TaskAwaiter 或 ConfiguredTaskAwaitable

How to await TaskAwaiter or ConfiguredTaskAwaitable in F#

在 C# 中等待任务等待者或 ConfiguredTaskAwaitable 非常简单 - 只需使用 await。 F# 的替代品是什么?

let! result = ...? doSomething().ConfigureAwait(false) ...?

F# async workflows 和 C# async-await 关键字是两个完全独立的机制,因此它们不直接兼容(尽管毫无疑问你可以拥有使之成为可能的包装器并且很可能已经有这样的包装器了).

如果您想将任务与 F# 异步工作流结合使用,您将使用实际任务而不是等待程序:

let! result = Async.AwaitTask task

如果你有一个 API 给你等待者而不是任务,这里是一个从 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()
        }