代码之家  ›  专栏  ›  技术社区  ›  Alex Netkachov

如何在F中等待TaskAwaiter或ConfiguredTaskAwaable#

  •  4
  • Alex Netkachov  · 技术社区  · 11 年前

    在C#中,等待任务awaiter is或ConfiguredTaskAwaable非常简单-只需使用 await 。F#的替代方案是什么?

    let! result = ...? doSomething().ConfigureAwait(false) ...?
    
    1 回复  |  直到 11 年前
        1
  •  5
  •   scrwtp    11 年前

    F#异步工作流和C#异步等待关键字是两种完全独立的机制,因此它们并不直接兼容(尽管毫无疑问,您可以使用包装器实现这一点,而且很可能已经有了这样的包装器)。

    如果您想将任务与F#异步工作流相结合,那么您应该使用实际任务而不是awaiters:

    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()
            }