【问题标题】:Error F# - c# async calls : converting Threading.Tasks.Task<MyType> to Async<'a>错误 F# - c# 异步调用:将 Threading.Tasks.Task<MyType> 转换为 Async<'a>
【发布时间】:2019-04-19 10:59:15
【问题描述】:

当我尝试从我的 F# 代码调用 C# 库中的异步方法时。 我收到以下编译错误。

这个表达式应该有类型 Async 但这里有类型 Threading.Thread.Tasks.Task

SendMessageAsync 在 C# 库中并返回 Threading.Thread.Tasks.Task&lt;MyType&gt;

let sendEmailAsync message = 
    async {
        let! response = client.SendMessageAsync(message)
        return response
    }

【问题讨论】:

    标签: f# c#-to-f# f#-async


    【解决方案1】:

    对于Task&lt;'T&gt;Async&lt;'T&gt; 之间的转换,有一个内置的Async.AwaitTask 函数。

    要在普通的 TaskAsync&lt;unit&gt; 之间进行转换,您可以创建一个辅助函数:

    type Async with
        member this.AwaitPlainTask (task : Task) =
            task.ContinueWith(fun t -> ())
            |> Async.AwaitTask
    

    那么你可以这样称呼它:

    let sendEmailAsync message = 
        async {
            let! response = Async.AwaitPlainTask <|client.SendMessageAsync(message)
            return response
        }
    

    当然,在这种情况下,响应不能是()以外的任何东西,所以你不妨写:

    let sendEmailAsync message = Async.AwaitPlainTask <|client.SendMessageAsync(message)
    

    【讨论】:

    • 非常感谢!我找不到 Async.AwaitPlainTask 而我有 Async.AwaitTask。
    • 啊,我的错。我刚刚找到了你创建的类型。
    • @NishantNidhiKumar 是的,它没有内置到核心库中,但创建它通常很有用。
    猜你喜欢
    • 2020-06-17
    • 2017-12-03
    • 2018-11-12
    • 2018-05-10
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多