je le code suivant dans F # 4,0f # effectuer attendent méthodes asynchrones dans list.iteri
let processEscalation escalationAction (escalationEvents:UpdateCmd.Record list) =
printf "%A" Environment.NewLine
printf "Started %A" escalationAction
escalationEvents
|> List.iter (fun x ->
printf "%A" Environment.NewLine
printf "escalation %A for with action: %A" x.incident_id escalationAction
service.PostAction(new Models.Action(x.incident_id, escalationAction, "escalated"))
|> Async.AwaitTask
|> ignore)
let ComposeEscalation() =
let escalationlevels = ["ESC1 REACHED"; "ESC2 REACHED"; "ESC3 REACHED"]
escalationlevels
|> List.map getEscalationEvents
|> List.iteri (fun i x -> processEscalation escalationlevels.[i] x)
où la ligne suivante est un appel à une méthode C# async que qui renvoie la tâche
service.PostAction(new Models.Action(x.incident_id, escalationAction, "escalated"))
La méthode d'escalade de composition appelle le processEscalation trois fois. Toutefois, le deuxième appel commence avant la fin du premier appel. Comment puis-je m'assurer que la dernière ligne list.iteri les attend et les traite séquentiellement? Peut-être que processEscalation devrait être dans une expression de calcul asynchrone?
Pourquoi 'processEscalation' n'attend-il la tâche que pour l'ignorer? –
'processEscalation' est utilisé pour effectuer une requête de service Web mais renvoie une tâche. Pour ce script particulier, je ne l'appelle que pour les effets secondaires, pas intéressé par la valeur retournée. Désolé, je suis relativement nouveau à la programmation fonctionnelle, donc je reconnais que ce n'est peut-être pas le meilleur moyen. –
Chinwobble