Interop avec la TPL .NET
TPL : Task Parallel Library
Interaction avec librairie .NET
Librairies asynchrones en .NET et pattern async
/await
C♯ :
→ Basés sur TPL et le type Task
Passerelles avec worflow asynchrone F♯ :
Fonctions
Async.AwaitTask
etAsync.StartAsTask
Bloc
task {}
Fonctions passerelles
Async.AwaitTask: Task<'T> -> Async<'T>
→ Consommer une librairie .NET asynchrone dans bloc async
Async.StartAsTask: Async<'T> -> Task<'T>
→ Lancer un calcul async sous forme de Task
Bloc task {}
task {}
Permet de consommer directement une librairie .NET asynchrone en ne faisant qu'un seul
Async.AwaitTask
plutôt que 1 à chaque méthode appelée
Async
vs Task
Async
vs Task
1. Mode de démarrage du calcul
Task
= hot tasks → calculs démarrés immédiatement❗
Async
= task generators = spécification de calculs, indépendante du démarrage
→ Approche fonctionnelle : sans effet de bord ni mutation, composabilité
→ Contrôle du mode de démarrage : quand et comment 👍
2. Support de l'annulation
Task
: en ajoutant un paramètre CancellationToken
aux méthodes async
→ Oblige à tester manuellement si token est annulé = fastidieux + error prone❗
Async
: support automatique dans les calculs - token à fournir au démarrage 👍
Pièges du pattern async
/await
en C♯
async
/await
en C♯Piège 1 - Vraiment asynchrone ?
En C♯ : méthode async
reste sur le thread appelant jusqu'au 1er await
→ Sentiment trompeur d'être asynchrone dans toute la méthode
En F♯ : async
ne définit pas une fonction mais un bloc
Préconisation pour fonction asynchrone en F♯
Fonction asynchrone = renvoyant un Async<_>
→ On s'attend à ce qu'elle soit totalement asynchrone
→ Fonction précédente workThenWait
ne respecte pas cette attente
☝ Préconisation : » Mettre tout le corps de la fonction asynchrone dans un bloc async
Piège 2 - Omettre le await
en C♯
await
en C♯Cela compile 📍 et produit un résultat inattendu After avant Before❗
Équivalent en F♯ :
Cela compile aussi 📍 et produit un autre résultat inattendu : pas de Before❗
Étude des warnings
Les exemples précédemment compilent mais avec des gros warnings !
Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the
await
operator...
En F♯, le warning FS0020 est accompagné du message
The result of this expression has type
Async<unit>
and is implicitly ignored. Consider usingignore
to discard this value explicitly...
☝ Préconisation : veillez à toujours traiter ce type de warning ! C'est encore + crucial en F♯ où la compilation est + délicate.
Dernière mise à jour
Cet article vous a-t-il été utile ?