287 messaggi dal 08 luglio 2008
Ciao a tutti, premetto che ho letto diversi articoli sulla programmazione parallela e asincrona, ma ho bisogno di una mano perchè non mi sono mai cimentato in un caso reale come quello che vi spiegherò a seguire.

Ho una pagina asp.net (4.5.2) che stampa a video una serie di prodotti facendo fondamentalmente 2 chiamate lato server a 2 metodi distinti e che non hanno nessuna interazione tra loro.

Siccome ogni metodo esegue una serie di query onerose in termini di tempo pensavo di chiamarli in maniera parallela, ma non ho ben capito se l'uso di async e await fa il caso mio.

Potete aiutarmi?

Vi ringrazio
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Siccome ogni metodo esegue una serie di query onerose in termini di tempo pensavo di chiamarli in maniera parallela, ma non ho ben capito se l'uso di async e await fa il caso mio.


Certo, puoi eseguire le due operazioni asincrone contemporaneamente e poi attendere che si completino entrambe.

var taskPrimoMetodo = EseguiQuery1(); //EseguiQuery1 deve essere un metodo asincrono
var taskSecondoMetodo = EseguiQuery2(); //E così anche EseguiQuery2

//Li attendo entrambi
await Task.WhenAll(new [] { taskPrimoMetodo, taskSecondoMetodo });

var risultato1 = taskPrimoMetodo.Result;
var risultato2 = taskSecondoMetodo.Result;


In questo modo riuscirai a ridurre il tempo di attesa che, teoricamente, sarà pari o di un po' superiore al tempo di esecuzione della query più lunga (potrebbe succedere che il database server soffra un po' per il fatto che gli lanci due query onerose contemporaneamente, ma dipende da cosa fanno effettivamente e se i dati letti si trovano sullo stesso disco o diversi).

ciao,
Moreno
Modificato da BrightSoul il 22 marzo 2017 08.49 -

Enjoy learning and just keep making
287 messaggi dal 08 luglio 2008
ciao, grazie per la risposta.

Ti chiedo solo una cosa, i 2 metodi, se asincroni, devono per forza restituire un valore da inserire in una variabile generica var, o come nel mio caso, posso mettere il risultato direttamente dentro una list<T>?

In pratica potrei scrivere cosi:



var taskPrimoMetodo = EseguiQuery1(); //EseguiQuery1 deve essere un metodo asincrono
var taskSecondoMetodo = EseguiQuery2(); //E così anche EseguiQuery2

//Li attendo entrambi
await Task.WhenAll(new [] { taskPrimoMetodo, taskSecondoMetodo });

List<myObj> risultato1 = taskPrimoMetodo.Result;
List<myObj> risultato2 = taskSecondoMetodo.Result;


???

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, certamente, puoi usare List<MyObj>.

Anche var va bene ugualmente ma dalla tua risposta penso di doverne chiarire il significato.

var non identifica un tipo "generico" ma un tipo ben determinato, che il compilatore inferisce dall'espressione che si trova alla destra dell'uguale.

Per esempio:
string sito = "aspitalia";
//è uguale che scrivere
var sito = "aspitalia";

Dichiarata con var o con string, la variabile sito sarà sempre di tipo string perché ciò che si trova alla destra dell'utile è una string.

Usare var può ridurre la leggibilità del codice perché può non risultare evidente qual è il suo tipo reale. Nel mio caso l'ho usato perché non mi era noto il tuo List<MyObject> ma non mi era necessario conoscerlo grazie a var.

Enjoy learning and just keep making

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.