Ciao a tutti,
ho un applicazione che deve chiamare diversi web service ognuno dei quali scrive i risultati che ottiene in un oggetto List.
Attualmente li chiamo in maniera sincrona uno dopo l altro.
Cosi facendo però per chiamare il successivo l applicazione deve attendere il completamento del precedente.
Questo vuol dire che il tempo di attesa è all incirca la somma di tutte le attese.
Invece io vorrei parallelizzare le richieste ai web service ( esse vengono effettuate con delle semplici HTTPWEBREQUEST sincrone ) in modo tale che il tempo di attesa si riduca all incirca all interrogazione più lenta.
Contemporaneamente però la pagina dovrà attendere che tutte le richieste asincrone siano complete e le richieste asincrone devono scrivere nello stesso oggetto ( nella stessa lista ).
Che approccio mi consigliate di utilizzare?
All inizio avevo pensato di rendere asincrone le HTTPWEBREQUEST ma ho letto da molte parti che nel caso di web application le istruzioni inserite dopo il BeginGetResponse vengono comunque eseguite dopo che la risposta è stata ricevuta e quindi non è realmente asincrono.
Allora ho pensato di creare dei thread diversi per ogni interrogazione al web service, solo che qui non saprei come fare ad attendere il compeltamento di ognuno e far in modo che scrivano tutti nello stesso oggetto contemporaneamente.
Che mi dite?

Grazie anticipatamente.
Grazie mille sul 4.0 è una soluzione eccellente. Ma se fossi costretto ad utilizzare 3.5?
Ciao ricciolo,
Ho fatto un giretto in rete riguardo i task Ed ho guardato l esempio che mi hai suggerito.
Dopo questa ricerca devo dire di essere un po' confuso riguardo la cosa.
Intanto che differenza c è tra Task.factory.fromasync e task.factory.startnew?

Poi... ho pensato di creare una lista di task e in ognuno di essi passargli una sub che contiene l httpwebrequest al ws. La sub effettua l httpwebrequest in maniera sincrona. Ogni sub effettua una web request diversa.
In poche parole qualcosa del genere:

Dim tasklist ad New list(of task)

Dim task1 as New task = task.Factory.startnew(address of sub1)
Tasklist.add(task1)

Dim task2 as New task = task.Factory.startnew(address of sub2)
Tasklist.add(task2)

Dim task3 as New task = task.Factory.startnew(address of sub3)
Tasklist.add(task3)

E così via.

Sub1 sub2 e sub3 e subN contengono delle httpwebrequest sincrone e il conseguente parsing Dell XML ricevuto.

In questo modo ottengo una parallezzizazione soddisfacente e un buon incremento di velocita secondo te? O c è una maniera migliore?

Grazie!
La differenza tra StartNew e FromAsync è che il primo esegue il codice indicato e con esso termina il task, impiegando il thread assegnatogli.
Con il FromAsync sfrutti il pattern begin/end. Senza usare il parallelfx, quando usi begin/end rilasci il thread chiamante e deleghi all'implementazione di lavorare in asincrono, in genere utilizzando io thread del sistema operativo, in genere migliore e più leggero rispetto ad impegnare un thread del processo corrente.

Quindi rispondendo alla tua domanda, va bene quello che hai fatto, anche se la soluzione ottiminare sarebbe usare il fromasync, che comunque non cambia come poi aspetti il termine del task e leggi l'xml. Usando questa tecnica comunque non troverai una differenza tangibile, se non se il sito è ad alto traffico.
Ricapitolando, lascia così

Ciao

Il mio blog
Homepage
Chiarissimo, ti ringrazio molto!

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.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC