Gå til innhold

HttpWebRequest - Invalid cross-thread access


Anbefalte innlegg

Jeg skal lese noe enkel data fra en fil på nettet inn på telefonen. Vanligvis ville jeg gjort dette med HttpWebRequest og .GetResponse, men den metoden finnes ikke lenger (iallfall ikke for WP7).

 

Det jeg har til nå (som garantert kunne vært gjort på en annen måte er:

 

    Public Sub LoadData()
  BeginReadData(urlBase & "WPseer.aspx")
  'AddData()
		'System.Diagnostics.Debug.WriteLine(Me.Items.Count)
   End Sub


#Region " Fetching Data "
   Private _data_from_server As String = String.Empty


   Private Sub AddData()
       Dim lines() As String = _data_from_server.Split(Constants.vbNewLine)
       For Each s As String In lines
           Dim i As New Item_Location() With {.Location = s}
           If s <> "Locations:" Then Me.Items.Add(i)
       Next

       Me.IsDataLoaded = True
   End Sub

   Private Sub BeginReadData(ByVal api_url As String, Optional ByVal user As String = "", Optional ByVal password As String = "")
       Dim request As HttpWebRequest = HttpWebRequest.Create(New Uri(api_url))
       request.BeginGetResponse(New AsyncCallback(AddressOf ReadCallback), request)
   End Sub

   Private Sub ReadCallback(asynchronousResult As IAsyncResult)
       Dim request As HttpWebRequest = DirectCast(asynchronousResult.AsyncState, HttpWebRequest)
       Dim response As HttpWebResponse = DirectCast(request.EndGetResponse(asynchronousResult), HttpWebResponse)

       Using streamReader1 As New IO.StreamReader(response.GetResponseStream())
           Dim resultString As String = streamReader1.ReadToEnd()
           _data_from_server = (resultString)
           AddData()
       End Using
   End Sub

#End Region

 

 

... men den feiler på Me.Items.Add(i) med en Invalid cross thread access exception. Jeg er ikke veldig flink med multithreading, men jeg har alltid fått det til.

 

Nå er jeg blank. Hva kan jeg gjøre?

Endret av Moskus
Lenke til kommentar
Videoannonse
Annonse

Invalid cross thread access exception får du fordi du forsøker å oppdatere UI fra en ikke-UI tråd. Du kan bruke Dispatcher.BeginInvoke for å komme deg på riktig tråd.

 

Du finner endel andre som har hatt problemet om du googler litt på feilmeldingen. Her er et relevant StackOverflow-spørmål.

Pokker heller, jeg har søkt i to dager! :p

Men takk! Det fungerer!

Tror jeg. ;)

 

 

Lenke til kommentar
  • 5 måneder senere...

Er det bare jeg som alltid bruker BackgroundWorker for å håndtere multithreading? Funker herlig bra og da man kan bruke ProgressChanged og/eller RUnWorkerCompleted-eventene for å oppdatere UI-tråden osv.

 

Det er ikke alltid like lett å forstå at et asynkront kall som i dette tilfellet blir pushet ut av UI tråden når callbacken kalles. Dette er ikke et typisk scenario hvor man bruker BackgroundWorker. Ellers bruker jeg ekstremt skjelden BackgroundWorker selv. Om jeg først bruker en bakgrunnstråd, så styrer jeg den selv. BackgroundWorker er en litt quick & dirty løsning imo.

Lenke til kommentar
  • 8 måneder senere...

Prøv å legg denne koden på Load() eventen:

 

CheckForIllegalCrossThreadCalls = False

 

Dette er ikke anbefalt. Men det kan løse enkelte problemer med multi-threading. Programmet vil generere eventuelle feil meldinger. Men programmet vil ikke krasje og avslutte.

Det fungerer i fullblods Windows, ikke på Windows Phone.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...