web-dev-qa-db-fra.com

Fonctions Azure: ICollector <T> vs IAsyncCollector <T>

Quelle est la différence entre ICollector<T> Et IAsyncCollector<T> Dans les fonctions Azure lors de l'écriture de fonctions C # (s'applique également aux WebJobs)?

Je comprends des exemples que ce sont des interfaces que je peux utiliser pour lier un paramètre de fonction à une liaison de sortie. Je comprends également que les deux interfaces ont des signatures de méthode non asynchrone et asynchrone en conséquence (c'est-à-dire ICollector<T>.Add(item) et IAsyncCollector<T>.AddAsync(item)). Mais que font-ils sous les couvertures? Publient-ils réellement des données dans la liaison de sortie, ou est-il tamponné en interne et vidé à la fin de l'exécution de la fonction (dans ce cas, pourquoi y aurait-il une méthode AddAsync)?

21
Chris Gillum

ICollector<T>.Add(item) effectuera toujours l'opération d'ajout sur le service sous-jacent immédiatement. Par exemple. l'implémentation de la liaison de file d'attente mettra les messages en file d'attente dès qu'ils sont ajoutés.

IAsyncCollector<T>.AddAsync(item) le comportement varie d'une liaison à une autre, selon que le service sous-jacent prend en charge traitement par lots. Dans de tels cas, AddAsync ne peut réellement enregistrer les éléments ajoutés que pour être vidés plus tard par le IAsyncCollector<T>.FlushAsync méthode. Lorsqu'une fonction se termine avec succès, FlushAsync sera appelé automatiquement. Vous pouvez autoriser le rinçage automatique à vider pour vous, ou vous pouvez choisir d'appeler FlushAsync manuellement dans votre fonction selon vos besoins.

Le traitement par lots peut permettre à la liaison d'interagir avec le service sous-jacent de la manière la plus efficace possible. Par exemple. pour Azure Tables, plusieurs entités peuvent être mises à jour/persistantes en une seule opération par lots.

19
mathewc