当我尝试从我的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
}
答案 0 :(得分:4)
要在Task<'T>
和Async<'T>
之间进行转换,有一个内置的Async.AwaitTask
功能。
要在普通Task
和Async<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)