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

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.