Hidden blog

Nella sapienza non c'è fine

 

posts - 20, comments - 11, trackbacks - 0

Invio richieste multiple a servizio Bing Maps con Silverlight

Stavo sviluppando un programma per ottenere le coordinate geografiche (utilizzando un servizio di bing maps) di alcuni miei indirizzi e ho avuto un problema sulla sincronizzazione.

Vi illustro il problema:

Ho creato una mia classe Indirizzo, con tutte le property necessarie.

Ho creato una List di elementi di tipo indirizzo.

Per ottenere le coordinate geografiche avevo semplicemente pensato di fare un ciclo nel seguente modo

Dim x As New GeocodeReference.GeocodeRequest 
x.Credentials = New GeocodeReference.Credentials 
x.Credentials.ApplicationId = "MioID" 
Dim y As New GeocodeReference.GeocodeServiceClient("BasicHttpBinding_IGeocodeService") 
For i As Integer = 0 To Source.Count - 1 Step 1 
s = i 
x.Query = Source(i).Via + " " + Source(i).Numero + ", " + Source(i).Citta + ", " + Source(i).Provincia 
AddHandler y.GeocodeCompleted, AddressOf GeocodeComplete 
y.GeocodeAsync(x) 
Next 

 

Dove Source è la mia lista di elementi indirizzo. Per ottenere il risultato, restituitomi dal servizio dopo aver lanciato il metodo GeocodeAsync, ho gestito l’evento GeodoceCompleted.

Private Sub GeocodeComplete(ByVal sender As Object, ByVal e As GeocodeReference.GeocodeCompletedEventArgs)
Dim z As New GeocodeReference.GeocodeResponse
z = e.Result
If z.Results.LongCount > 0 Then
Source(s).Latitudine = z.Results(0).Locations(0).Latitude
Source(s).Longitudine = z.Results(0).Locations(0).Longitude
End If
End Sub
 

 

Ma nel complesso c’era un problema prima ancora che ottenessi il risultato della prima richiesta il ciclo for aveva già finito e aveva inviato altre richieste creando un disastro. Per risolvere ho utilizzato la classe AutoResetEvent

Public auto As New AutoResetEvent(False)

 

ed l’ho utilizzato così nel cilco

Dim x As New GeocodeReference.GeocodeRequest
x.Credentials = New GeocodeReference.Credentials
x.Credentials.ApplicationId = "MioId"
Dim y As New GeocodeReference.GeocodeServiceClient("BasicHttpBinding_IGeocodeService")
For i As Integer = 0 To Source.Count - 1 Step 1
s = i
x.Query = Source(i).Via + " " + Source(i).Numero + ", " + Source(i).Citta + ", " + Source(i).Provincia
AddHandler y.GeocodeCompleted, AddressOf GeocodeComplete
y.GeocodeAsync(x)
auto.WaitOne()  'Con questo fermo il thread in attesa di un segnale
Next
 

 

mentre nella gestione dell’evento GeocodeComplete

Private Sub GeocodeComplete(ByVal sender As Object, ByVal e As GeocodeReference.GeocodeCompletedEventArgs)
Dim z As New GeocodeReference.GeocodeResponse
z = e.Result
If z.Results.LongCount > 0 Then
Source(s).Latitudine = z.Results(0).Locations(0).Latitude
Source(s).Longitudine = z.Results(0).Locations(0).Longitude
End If
auto.Set()  'Invia il segnale per far ripartire il thread in attesa
End Sub
 

 

Ora saprò dove andare a trovare la soluzione nel caso (anche se difficile) la dimenticassi o nel caso servisse a qualcuno.

Francesco Valentino

Print | posted on mercoledì 27 ottobre 2010 9.15 |

Feedback

No comments posted yet.

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 6 and 1 and type the answer here:

Powered by: