Hidden blog

Nella sapienza non c'è fine

 

posts - 20, comments - 11, trackbacks - 0

mercoledì 27 ottobre 2010

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

posted @ mercoledì 27 ottobre 2010 9.15 | Feedback (0) |

Silverlight 4 - Applicazione Out of Browser

Ho ritrovato molto utile questo link per lo sviluppo di applicazioni silverlight che non necessariamente richiedono di essere eseguite da un borwser.

A me è servito in quanto stavo sviluppando un programma, da eseguire in locale, che doveva avere accesso in lettura e scrittura a dei file system (che come sappiamo per motivi di sicurezza Silverlight non permette), in questo modo ho risolto il mio problema.

Sperando vi possa servire.

 

Francesco Valentino

 

Technorati Tag: ,

posted @ mercoledì 27 ottobre 2010 6.34 | Feedback (0) |

Powered by: