如何在 F# 中等待 TaskAwaiter 或 ConfiguredTaskAwaitable

Ale*_*hov 4 f# async-await

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

let! result = ...? doSomething().ConfigureAwait(false) ...?
Run Code Online (Sandbox Code Playgroud)

scr*_*wtp 5

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)