1 messaggio dal 08 dicembre 2018
Ciao a tutti,
ho sviluppato una procedura che effettua diverse chiamate verso alcuni endpoints XML o JSON per poi processarne il contenuto ricevuto. La HttpWebRequest viene ovviamente effettuata asincrona mentre il parse di quanto ricevuto è necessariamente un operazione sincrona. Per non aspettare la risposta di un endpoint prima di passare al successivo ho strutturato il tutto cosi:

Dim TaskList as new List(Of Task)

For Each f as Fornitore in Fornitori

Dim MyTask = ChiamaFornitore(f)
TaskList.Add(MyTask)

Next

La funzione ChiamaFornitore effettua la chiamata Http asincrona per recuperare il contenuto in stringa e quindi lo parsa tramite una funzione sincrona:

Async Function ChiamaFornitore(byval f as Fornitore) as Task

Dim XmlResult as string = Await RecuperaXMLFornitore(f) 'OPERAZIONE ASINCRONA

ParsaContenuto(XmlResult) 'SUB SINCRONA

End Function

ParsaContenuto è una sub in quanto non deve restituire nulla perchè persiste il risultato in una cache.

Cosi strutturato il tutto sono sicuro al 99% riguardo il parallelismo delle chiamate HTTP; vedo infatti che le varie richieste partono senza aspettare che le precedenti abbiano ricevuto una risposta. Inoltre le risposte non sono poi in ordine di chiamata ma in ordine sparso in base all' endpoint che ha risposto prima.

Quello che non capisco, e che non riesco a testare, è come viene trattata la chiamata sincrona di parse. Se ad esempio un particolare parse sta impiegando più tempo perchè magari l' XML o il JSON ricevuto è abbastanza grande, cosa succede? Finchè non termina la procedura non parsa altri risultati? In poche parole cosi c'è un parallelismo anche nel parse o vengono fatti in maniera sequenziale? Cosa succede se un endpoint risponde mentre è ancora in corso il parse di un altra risposta?

Una variante che avevo pensato per essere sicuro del parallelismo anche nel parse era di lanciarlo con una Task.Run, quindi la funzione diventerebbe:

Async Function ChiamaFornitore(byval f as Fornitore) as Task

Dim XmlResult as string = Await RecuperaXMLFornitore(f) 'OPERAZIONE ASINCRONA

Task.Run(Sub
ParsaContenuto(XmlResult)
End Sub)

End Function

però questo se non erro equivale a lanciare un Thread separato e se non è necessario eviterei perchè potrebbe spararne troppi e diventare incontrollato...

Che ne pensate?
Grazie a chi mi aiuterà!
Modificato da andry80pa il 13 novembre 2019 22:01 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.