Ich habe zwei asynchrone Operationen, so habe ich diese Funktionen:Wie führe ich zwei Async <> Aufrufe mit unterschiedlichen Ergebnistypen parallel aus?
// Returs Async<Person>
let GetPerson =
...
// Returs Async<Address>
let GetAddress =
...
Was ist der idiomatische Weg, um sie parallel auszuführen und deren Ergebnisse zu erzielen?
Mein Ausgangspunkt ist dieser Ansatz.
let MyFunc = async {
let! person = GetPerson()
let! address = GetAddress()
...
}
Dies funktioniert, aber das führt die beiden Operationen nacheinander.
Ich habe auch versucht, diese (basierend auf meiner C# -Erfahrung).
let MyFunc = async {
let personA = GetPerson()
let addressA = GetAddress()
let! person = personA
let! address = addressA
...
}
Aber es funktioniert nicht, es führt auch die zwei Operationen nacheinander.
Was die meisten der Dokumentation sagt, ist Async.Parallel
mit einer Sequenz zu verwenden, aber das Problem ist, dass der Ergebnistyp der beiden Operationen unterschiedlich sind, so dass ich sie nicht in eine Sequenz einfügen kann.
let MyFunc = async {
let personA = GetPerson()
let addressA = GetAddress()
[personA; addressA]
|> Async.Parallel
...
}
Dies ergibt einen Übersetzungsfehler, da die beiden Werte verschiedene Typen haben. (Und mit dieser Syntax, wie könnte ich die tatsächlichen Ergebnisse erhalten?)
Was ist der idiomatische Weg, dies zu tun?
Wenn "GetPerson" und "GetAddress" ebenfalls asynchrone Primitive sind, sollten sie nach Konvention auch Async vorangestellt werden. d.h. 'asyncGetPerson 'und' asyncGetAddress '? – Chinwobble
Dies ist sicherlich der Fall für F # Bibliotheksfunktionen ('AsyncGetResponse' vs.' GetResponse'). Ich würde diesem Muster folgen, wenn ich synchrone und asynchrone Versionen hätte, aber wahrscheinlich nicht, wenn ich Code schreibe, der nur asynchrone Version hat. –
@TomasPetricek Ich bemerkte, dass für '' Async.Merge'' auf Ihrem Joinads-Blog '' Async.Parallel'' statt dieser 'idiomatischen' Methode verwendet wurde. Ich bin neugierig, warum Sie einen solchen Ansatz verwendet haben, ist es für ein bestimmtes Szenario effizienter? – Gustavo