2017-04-18 2 views
2

lorsque j'essaie d'appeler une méthode async qui se trouve dans la bibliothèque C# de mon code F #. Je reçois ci-dessous erreur de compilation.Erreur F # - C# appels asynchrones: conversion Threading.Tasks.Tak <MyType> en Async <'a>

Cette expression devait avoir le type Async < « a> mais ici est de type Threading.Thread.Tasks.Task

SendMessageAsync est dans la bibliothèque C# et retourne Threading.Thread.Tasks.Task

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

Répondre

2

Pour la conversion entre Task<'T> et Async<'T> il y a une fonction Async.AwaitTask intégrée.

Pour convertir entre une plaine Task et Async<unit> vous pouvez créer une fonction d'assistance:

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

Ensuite, vous pouvez l'appeler comme ceci:

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

Bien sûr, dans ce cas, la réponse ne peut être autre chose que (), donc vous pourriez aussi bien écrire:

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

merci beaucoup! Je ne peux pas trouver Async.AwaitPlainTask à la place j'ai Async.AwaitTask. –

+0

ah, mon erreur. Je viens de trouver le type que vous avez créé. –

+0

@NishantNidhiKumar Oui, celui-ci n'est pas intégré à la bibliothèque principale mais il est souvent utile de le créer. – TheInnerLight