Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Async - Await Hell

  1. #1

    Async - Await Hell

    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 cosiim TaskList as new List(Of Task)For Each f as Fornitore in FornitoriDim MyTask = ChiamaFornitore(f)TaskList.Add(MyTask)NextLa 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 TaskDim XmlResult as string = Await RecuperaXMLFornitore(f) 'OPERAZIONE ASINCRONAParsaContenuto(XmlResult) 'SUB SINCRONAEnd FunctionParsaContenuto è 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 TaskDim XmlResult as string = Await RecuperaXMLFornitore(f) 'OPERAZIONE ASINCRONATask.Run(SubParsaContenuto(XmlResult)End Sub)End Functionperò 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à!

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    ci sono lavori in corso.............riapri il thread quando saranno fixate le ultime cose. grazie della pazienza
    Ultima modifica di djciko; 14-11-2019 a 23:19

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.