错误F# - c#异步调用:将Threading.Tasks.Task <mytype>转换为Async&lt;'a&gt;

时间:2017-04-18 15:15:49

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

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

  

预计此表达式的类型为Async&lt;'a&gt;但这里有类型Threading.Thread.Tasks.Task

SendMessageAsync位于C#库中,并返回Threading.Thread.Tasks.Task<MyType>

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

1 个答案:

答案 0 :(得分:4)

要在Task<'T>Async<'T>之间进行转换,有一个内置的Async.AwaitTask功能。

要在普通TaskAsync<unit>之间进行转换,您可以创建辅助函数:

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)