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

Nis*_*mar 4 f# c#-to-f# f#-async

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

该表达式应具有Async <'a>类型,但此处具有Threading.Thread.Tasks.Task类型

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

let sendEmailAsync message = 
    async {
        let! response = client.SendMessageAsync(message)
        return response
    }
Run Code Online (Sandbox Code Playgroud)

The*_*ght 5

为了在Task<'T>和之间进行转换,Async<'T>有一个内置Async.AwaitTask函数。

要在普通格式Task和普通格式之间进行转换,Async<unit>可以创建一个辅助函数:

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

然后您可以这样称呼它:

let sendEmailAsync message = 
    async {
        let! response = Async.AwaitPlainTask <|client.SendMessageAsync(message)
        return response
    }
Run Code Online (Sandbox Code Playgroud)

当然,在这种情况下,响应不能是(),因此您最好只写:

let sendEmailAsync message = Async.AwaitPlainTask <|client.SendMessageAsync(message)
Run Code Online (Sandbox Code Playgroud)