2017-04-18 3 views
2

wenn ich versuche, eine asynchrone Methode, die in C# -Bibliothek von meinem F # -Code ist. Ich bekomme unten Kompilierungsfehler.Fehler F # - C# Async-Aufrufe: Umwandlung Threading.Tasks.Tak <MyType> in Async <'a>

Diesen Ausdruck erwartet Typ Async < ‚a haben,> aber hier hat

SendMessageAsync ist in C# -Bibliothek Threading.Thread.Tasks.Task Typ und gibt Threading.Thread.Tasks.Task

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

Antwort

2

Für die Konvertierung zwischen Task<'T> und Async<'T> gibt es eine eingebaute Async.AwaitTask Funktion.

zwischen einem einfachen Task konvertieren und Async<unit> Sie eine Hilfsfunktion erstellen können: Sie können es so

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

Dann rufen:

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

Natürlich in diesem Fall ist die Antwort kann nichts anderes als () sein, also können Sie auch gerade schreiben:

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

vielen dank! Ich kann Async.AwaitPlainTask nicht finden, stattdessen habe ich Async.AwaitTask. –

+0

aah, mein Fehler. Ich habe gerade den Typ gefunden, den du erstellt hast. –

+0

@NishantNidhiKumar Ja, das ist nicht in der Core-Bibliothek eingebaut, aber es ist oft nützlich zu erstellen. – TheInnerLight

Verwandte Themen