Ciao a tutti,
sto creando un windows service al posto di una vecchia console application.
Semplificando l'esecuzione quello che viene fatto (console) è il seguente
//Nota : Pseudocodice
Lista<Prodotto> listaProdotti = new Lista<Prodotto>
List<int> listaIDCataloghi = ChiamaWebServiceEOttieniCataloghi();
foreach(int i in listaIDCataloghi)
{
ListaProdotti<int> listaIDProdotti = ChiamaWebServiceEOttieniProdotti();
foreach(int j in listaIDProdotti)
{
Prodotto prodotto = ChiamaWebServiceEottieniDettaglioProdotto();
listaProdotti.Add(prodotto);
InserisciProdottoNelDB(listaProdotti);
}
}
Il tempo di esecuzione profilato con dotTrace 3.1 è di 242secondi (lo so è tanto!).
Ho cominciato a fare un pò di refactoring e inserendo dei thread (sotto come ho fatto per adesso) in questo modo, ho "recuperato" 40 secondi :
foreach(int i in listaIDCataloghi)
{
ListaProdotti<int> listaIDProdotti = ChiamaWebServiceEOttieniProdotti(i);
Thread t = new Thread(DoStuff);
t.ThreadStart(i);
}
private void DoStuff(object o)
{
int idCatalogo = (int)o;
foreach(int j in listaIDProdotti)
{
Prodotto prodotto = ChiamaWebServiceEottieniDettaglioProdotto(idCatalogo);
listaProdotti.Add(prodotto);
//Gestita con lock su listaProdotti
InserisciProdottoNelDB(listaProdotti);
}
}
Visto che la parte "pesante" e dove viene persa la maggior parte del tempo è quella del loop e richiesta dei singoli prodotti, esiste un modo "sicuro" per lanciare thread e far aspettare che siano terminati tutti prima di uscire dall'applicazione? Ho provato a eseguire la mia nuova versione con un ThreadPool.QueueUserWorkItem nel foreach piu interno ma ottengo tutte le volte un numero differente di oggetti restituiti...
Grazie ciao