buongiorno
sto lavorando ad un web service ma è molto lento perchè le chiamate vengono fatte una dietro l'altra ma ogni chiamata impiega tempo per restituire il risultato. Allora ho provato a fare tutte le chiamate asincrone, il problema è che succede un casino, non so se esiste ma avrei bisogno di un evento dove sono sicuro che si siano scatenati tutti gli eventi delle chiamate del web service, quindi nell'evento scatenato dalle chiamate del ws andrei a creare una lista e nell'evento finale (che viene scatenato dopo tutti gli eventi del ws) darei in pasto la lista ad una gridview. Ho provato con il prerender ma non va bene perchè gli eventi asincroni non sono ancora stati scatenati. Ringrazio in anticipo chi potrà darmi una mano.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
quando vuoi parallelizzare delle richieste, affidati alla task parallel library. Qui c'è un articolo di Cristian Civera che illustra un caso molto simile al tuo.
http://www.winfxitalia.com/script/265/Parallelizzare-Download-Pagine-Web-Tramite-Task-Parallel-Library-.NET.aspx

In pratica usi il metodo WaitAll per attendere che tutti i task siano completati, oppure fornisci una callback con ContinueWhenAll.

ciao,
Moreno

Enjoy learning and just keep making
ciao Moreno grazie per la risposta, il concetto che dici te sembra quello più esatto il fatto è che non riesco ad applicarlo sul mio web service nel mio sistema effettuo delle chiamate sincrone, il ws è aggiunto come riferimento web e quindi non ho le funzioni begin ed end, potrei provare con ContinueWhenAll ma non ho capito bene il funzionamento, cioè dopo come faccio a ricavarmi il risultato restituito dalla chiamata effettuata nel task Task.Factory.StartNew
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Paolo,
puoi avviare un task con Task.Factory.StartNew anche se il tuo codice è sincrono, devi solo wrapparlo in una lambda expression.
Ecco un esempio di come poi andrai leggere il valore di ritorno.
http://msdn.microsoft.com/en-us/library/dd537613(v=vs.110).aspx

paolocamping ha scritto:

il ws è aggiunto come riferimento web e quindi non ho le funzioni begin ed end

Volendo potresti averle, perché Visual Studio può generare anche le varianti asincrone di ciascun webmethod.
http://stackoverflow.com/questions/7580906/whether-generated-wcf-service-client-is-synchronous-or-asynchronous-by-default

ciao,
Moreno

Enjoy learning and just keep making
ciao Moreno
grazie per la risposta, sono riuscito a creare un array di Task che richiamano un metodo di un web service che viene chiamato circa 80 volte e darlo in pasto al metodo Task.WaitAll, purtroppo i risultati non sono stati quelli che speravo perchè i tempi di esecuzione sono sempre alti. Qeusto è il codice in lina di massima:

using (MioWS ws = new MioWS())
{

ClasseWS[] listaRisultatiWS = ws.GetRisultatiWS();

foreach(ClasseWS classeWS in listaRisultatiWS)
{
tasks.Add(System.Threading.Tasks.Task<MiaClasse>.Factory.StartNew(() => { var risultato = ws.metodo(classeWS.id); }));
}


Task.WaitAll(tasks.ToArray());

foreach (Task<MiaClasse> item in tasks)
{
listaClassi.Add(item.Result.response);
}

}
come ti dicevo i risultati sono gli stessi dello script senza task, sembra come se i metodi vengono comunque richiamati in modo sincrono uno dietro l'altro e non tutti insieme
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,

sembra come se i metodi vengono comunque richiamati in modo sincrono

ok, cerca il eliminare il "sembra". Accertatene misurando l'effettivo tempo di esecuzione con la classe Stopwatch.

Se riesci a verificare in maniera consistente che non c'è quasi differenza, allora il problema potrebbe essere altrove.
Il collo di bottiglia potrebbe essere proprio il servizio WCF, se sta elaborando una singola richiesta alla volta.
Leggi qui come consentire richieste multiple.
http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and#Three+types+of+WCF+concurrency

Ovviamente fai questa modifica solo se l'accettare richieste multiple non avrà alcuna ripercussione sulla logica del servizio, tipo errori derivanti da scritture contemporanee su una risorsa.

ciao,
Moreno

Enjoy learning and just keep making
ciao Moreno
ho cercato di parallelizzare tutte le richieste del web service e alla fine ho ottenuto un discreto miglioramento, sono passato da 1 minuto di media a richiesta a 20 secondi con i miglioramenti al web service spero di arrivare sotto a 10 secondi grazie mille per il tuo aiuto

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.